要在Entity Framework中编辑多对多关系,为什么我必须先清除该集合?

时间:2017-10-31 20:05:57

标签: c# entity-framework

我有以下代码用于编辑用户所在的部门。由于某些原因,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()
}

1 个答案:

答案 0 :(得分:2)

部门下面,我的意思是Users2Departments表。

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

但是,如果您只执行分配:user.departments = departmentsEF将不知道或不关心,存在部门并且应该删除它们,因为,至少,他们没有被跟踪,因为他们没有被加载,因为user.departments文字位于 HandSide(user.departments.clear() HandSide)。而且Users2Departments表是隐式表。因此EF只会插入新的部门,而不会删除之前的部门,因此可能会发生异常。