2017-03-08 58 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表许多一对多

希望帮你