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
异常。