2017-03-08 56 views
0

我有兩個實體的用戶和角色如何刪除EF中的Many to many表中的記錄而不刪除它自己的實體?

public partial class User 
{ 
public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string SecondName { get; set; } 
    public virtual ICollection<Role> Roles { get; set; } 

}

public partial class Role 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; }  
    public virtual ICollection<User> Users { get; set; } 
} 

和我的數據庫只包含用戶名和角色ID具有表(RoleUser)。 我想修改用戶,刪除角色用戶表中存在的行並插入新記錄。 當我用這下面的代碼它刪除RoleUser表中的行,也是角色本身

public void Update(User usr) 
    { 
     var existingParent = _context.Users 
      .Where(p => p.Id == usr.Id) 
      .Include(p => p.Roles) 
      .SingleOrDefault(); 

     if (existingParent != null) 
     { 
      // Update parent 
      _context.Entry(existingParent).CurrentValues.SetValues(usr); 

      // Delete children 
      foreach (var existingChild in existingParent.Roles.ToList()) 
      { 
       if (!usr.Roles.Any(c => c.Id == existingChild.Id)) 
        _context.Roles.Remove(existingChild); 
      } 
      } 
     } 

的問題是如何刪除存在的記錄RoleUser表,沒有刪除實體本身插入新記錄?

+0

檢查你的數據庫模型。如果其中一個外鍵被刪除(這裏是User),則連接表(RoleUser)應該級聯刪除。然後,您只需要在您的代碼中刪除用戶,並且數據庫將負責角色用戶 – Mats391

+0

ASP.NET與Entity Framework完全無關。 ASP.NET(和MVC)是Web框架,EF是一個ORM。如果你使用ASP.NET術語尋找EF答案,你將無法找到你想要的東西 –

回答

1

您需要執行此操作以僅在多對多表中刪除記錄。請讓我知道這對你有沒有用。

IObjectContextAdapter contextAdapter = (IObjectContextAdapter)_context; 
ObjectStateManager stateManager = contextAdapter.ObjectContext.ObjectStateManager; 

stateManager.ChangeRelationshipState(existingParent, existingChild, "Roles", EntityState.Deleted); 

_context.SaveChanges(); 

要添加新的值:

_context.Entry(existingParent).Collection("Roles").CurrentValue = values; 

哪裏values是您的數據列表中添加(應該是IEnumerableICollection,所以List<Role>是確定)。 values必須包含鏈接到數據庫的對象。

foreach (Role entry in newValues) { 
    values.Add(_context.Set(typeof(Role)).Find(entry.Id)); 
} 
+0

非常感謝你,它對我很好,但現在我需要添加新的行,你可以給我暗示 –

+0

You'歡迎。我用補充部分更新了我的答案。 – erikscandola

+0

但是這段代碼在角色表中插入了新的記錄。大小寫是我想只在表(RoleUser)中插入它之前存在的角色。 –

0

這是刪除代碼

_context.Users.find(userId).Roles.Remove(_context.Roles.find(roleId)); 
_context.SaveChange(); 

這是代碼添加

_context.Users.find(userId).Roles.Add(_context.Roles.find(roleId)); 
_context.SaveChange(); 

這將節省用戶名和角色ID表許多一對多

希望幫你