C# 要在实体框架中编辑多对多关系,为什么必须首先清除集合?

C# 要在实体框架中编辑多对多关系,为什么必须首先清除集合?,c#,entity-framework,C#,Entity Framework,我有以下代码用于编辑用户所在的部门。由于某种原因,method1导致EF再次尝试插入关系(并导致主键错误),其中method2成功 为什么method1的代码不知道通过重新分配值,我只想要新的部门集合?method2是更新值的首选方法吗?我没有必要在一对多的关系中这样做 public class User { public string name { get; set; } public virtual List<Department> Departments { g

我有以下代码用于编辑用户所在的部门。由于某种原因,
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()
}
公共类用户
{
公共字符串名称{get;set;}
公共虚拟列表部门{get;set;}
}
公共课系
{
公共字符串名称{get;set;}
公共虚拟列表用户{get;set;}
}
public void Method1(列出部门,字符串userId)
{
var user=DbContext.Users.FirstOrDefault(u=>u.Id==userId);
user.departments=部门;
db.SaveChanges()
}
public void Method2(列出部门,字符串userId)
{
var user=DbContext.Users.FirstOrDefault(u=>u.Id==userId);
user.departments.clear();
user.departments=部门;
db.SaveChanges()
}
下面关于部门,我指的是
Users2Departments

可能是因为编写
user.departments.clear()时
您加载了所有相关部门(通过
LazyLoading
),因此它们可以通过
EF
进行跟踪,并成功地标记为
已删除
(在
清除()
调用之后)。然后将新部门分配给
用户
,即标记为
已添加
。一切都是正确的


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

正确。多对多关联只能作为操作。感谢您的解释。那么更新独立关联的正确方法是什么?@ChrisChevalier、 首先,加载部门:
var dep=user.departments;
,然后您可以删除其中一些:
user.departments.remove(dep[0]);
或添加新的部门:
user.departments.add(newDep)
,但最后一种情况是
newDep
最初不应该存在于
user.departments
,以避免出现
PK
异常。