2017-03-17 92 views
0

我試圖從數據庫中刪除記錄的範圍,並嘗試如下方法:實體框架中實現RemoveRange

public void DeleteAllRolesFromUser(int userId, FilterDto filter) 
     { 
      var unitOfWork = _serviceLocator.Resolve<IUnitOfWork>(); 
      var filterValidatorService = _serviceLocator.Resolve<IFilterValidatorService>(); 

      // Prep filter if properties are null 
      filter = filterValidatorService.ValidateListFilter(filter);   

      var userRoles = GetUserRoles(userId, filter); 
      var usersAllRoles = new List<UserRole>(); 

      foreach (RoleDto role in userRoles) 
      { 
       var UserRole = new UserRole(); 
       UserRole.RoleId = role.Id; 
       UserRole.UserId = userId; 
       usersAllRoles.Add(UserRole); 
      } 
      // Delete user role 
      unitOfWork.UserRoles.RemoveRange(usersAllRoles); 

      // Perform changes 
      unitOfWork.SaveChanges(); 
     } 

其中的UserRole和RoleDto是這樣的:

public class UserRole : IdentityUserRole<int>, IModelWithId 
     { 
      public int Id {get; set; } 

      public int UserId { get; set; } 
      public virtual User User { get; set; } 

      public int RoleId { get; set; } 
      public virtual Role Role { get; set; } 
     } 
public class RoleDto : IModelWithId 
    { 
     public int Id { get; set; }  

     public string Name { get; set; }  

     public string Description { get; set; } 

     public bool Active { get; set; } 

     public bool CanExport { get; set; } 

     public int? UserCount { get; set; } 
    } 

我得到錯誤:該對象無法刪除,因爲它在ObjectStateManager中找不到。

回答

0

我做了另一種方式。我在列表中使用userId獲得所有記錄,然後使用RemoveRange()運行正常,沒有錯誤。

var userRoles = unitOfWork.UserRoles.GetByUserId(userId).ToList(); 
      // Delete user role 
      unitOfWork.UserRoles.RemoveRange(userRoles); 

      // Perform changes 
      unitOfWork.SaveChanges(); 
0

因爲你的新的UserRole對象剛剛創建爲什麼不

unitOfWork.UserRoles.RemoveRange(unitOfWork.UserRoles.where(r=>r.UserId==userId)); 

你得到的錯誤,你沒有從你的DbContext得到它們。所以他們需要以某種方式鏈接到你的dbcontext。附加功能就是出於這個原因。

嘗試調用

  foreach (RoleDto role in userRoles) 
     { 
      var UserRole = new UserRole(); 
      UserRole.RoleId = role.Id; 
      UserRole.UserId = userId; 
      usersAllRoles.Add(UserRole); 
      unitOfWork.UserRoles.Attach(UserRole); 
     } 
     // Delete user role 
     unitOfWork.UserRoles.RemoveRange(usersAllRoles); 
+0

UserRoles是一個存儲庫,它沒有Where方法。 – Dipak

0

這意味着實體沒有連接(它不是由相同的上下文加載)。 試試這個:

foreach (RoleDto role in userRoles) 
      { 
       var UserRole = new UserRole(); 
       UserRole.RoleId = role.Id; 
       UserRole.UserId = userId; 
       unitOfWork.UserRoles.Attach(UserRole); 
       unitOfWork.Entry(UserRole).State = EntityState.Deleted; 
      } 
      unitOfWork.SaveChanges();