如何在EF中删除多对多表中的记录而不删除它自己的实体?

时间:2017-03-08 06:30:55

标签: c# sql-server entity-framework

我有两个实体用户和角色

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; }
}

我在数据库中有表(RoleUser)只包含userid和role id。 我想修改用户,删除RoleUser表中存在的行并插入新记录。 当我使用以下代码时,它会删除RoleUser Table中的行以及角色本身

   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 Table中存在的记录并插入新记录而不删除实体本身?

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:1)

这是删除代码

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

这是添加

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

它会将userid和roleid保存到表多对多

希望帮助你