【问题标题】:To edit a many to many relationship in Entity Framework, why must I clear the collection first?要在实体框架中编辑多对多关系,为什么必须先清除集合?
【发布时间】:2017-10-31 20:05:57
【问题描述】:

我有以下代码用于编辑用户所在的部门。出于某种原因,method1 导致 EF 尝试再次插入关系(并导致主键错误),其中method2 成功。

为什么method1的代码不知道通过重新赋值,我只想要新的部门集合? method2 是更新值的首选方法吗?对于一对多的关系,我不必这样做。

public class User
{
    public string name { get; set; }
    public virtual List<Department> Departments { get; set; }
}

public class Department
{
    public string name { get; set; }
    public virtual List<User> Users { get; set; }
}

public void Method1(list<Department> departments, string userId)
{
    var user = DbContext.Users.FirstOrDefault(u=> u.Id == userId);
    user.departments = departments;
    db.SaveChanges()
}

public void Method2(list<Department> departments, string userId) 
{
    var user = DbContext.Users.FirstOrDefault(u=> u.Id == userId);
    user.departments.clear();
    user.departments = departments;
    db.SaveChanges()
}

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    部门下面,我指的是Users2Departments表。

    这可能是因为,当您编写 user.departments.clear(); 时,您加载了所有相关的部门(通过 LazyLoading),因此它们可以被 EF 跟踪并成功标记为 Deleted (在clear() 电话之后)。然后将新的部门分配给user,即标记为Added。一切都是正确的。

    但是,如果您只执行分配:user.departments = departmentsEF 将不知道或不在乎存在存在的部门,它应该删除它们,因为至少,它们未跟踪,因为它们未加载,因为 user.departments 文字位于 LeftHandSide(user.departments.clear() is RightHandSide)。此外Users2Departments 表是隐式表。所以EF 只插入新的部门 而不会删除以前的,所以可能会出现异常。

    【讨论】:

    • 正确。多对多关联只能操作为independent associations
    • 感谢您的解释。那么更新独立关联的正确方法是什么?
    • @ChrisChevalier,首先,加载部门:var dep = user.departments;,然后您可以删除其中一些:user.departments.Remove(dep[0]); 或添加新的:user.departments.Add(newDep),但最后一种情况newDep 不应该最初存在于user.departments,以避免PK 异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2011-12-17
    相关资源
    最近更新 更多