我有以下代码用于编辑用户所在的部门。由于某些原因,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()
}
答案 0 :(得分:2)
在部门下面,我的意思是Users2Departments
表。
可能发生这种情况的原因是,当您编写user.departments.clear();
时,您加载了所有相关的部门(通过LazyLoading
),因此EF
可以跟踪它们已成功标记为Deleted
(clear()
之后)。然后将新的部门分配给user
,即标记为Added
。一切都是正确的。
但是,如果您只执行分配:user.departments = departments
,EF
将不知道或不关心,存在部门并且应该删除它们,因为,至少,他们没有被跟踪,因为他们没有被加载,因为user.departments
文字位于左 HandSide(user.departments.clear()
右 HandSide)。而且Users2Departments
表是隐式表。因此EF
只会插入新的部门,而不会删除之前的部门,因此可能会发生异常。