假设你的实体类中有以下这些类。
public class Parent
{
public int ParentID { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
public class Child
{
public int ChildID { get; set; }
public int ParentID { get; set; }
public virtual Parent Parent { get; set; }
}
你需要一个用户界面来更新Parent
以及其Children
,这意味着如果用户添加新的Child
,则您必须插入,如果用户编辑现有的Child
,则需要更新,如果用户删除了Child
,则必须删除。现在,如果您使用以下代码,则显然不会实现所述功能。
public void Update(Parent obj)
{
_parent.Attach(obj);
_dbContext.Entry(obj).State = EntityState.Modified;
_dbContext.SaveChanges();
}
由于EF无法检测导航属性内部的更改,因此它将无法检测到Child
内部的更改。
我已经问了4次这个问题并得到了不同的答案。那么是否真的有可能在不变得复杂的情况下完成这项工作呢?通过将用户界面分离为Parent
和Child
之间来解决此问题,但我不想这样做,因为在商业应用程序开发中,在一个菜单中合并Child
和Parent
是相当常见且更加用户友好的。
更新: 我正在尝试以下解决方案,但它不起作用。
public ActionResult(ParentViewModel model)
{
var parentFromDB = context.Parent.Get(model.ParentID);
if (parentFromDB != null)
{
parentFromDB.Childs = model.Childs;
}
context.SaveChanges();
}
EF无法检测到子级更改,因此无法处理旧的子级。例如,如果parentFromDB
在第一次从数据库中获取时有3个子项,然后我删除第2个和第3个子项。然后,在保存时出现由于一个或多个外键属性不可为空,因此无法更改关系
。
我认为这就是发生的事情: 由于一个或多个外键属性不可为空,因此无法更改关系
这让我重新回到起点,因为在我的情况下,我不能仅从数据库中获取并更新条目,然后调用SaveChanges
。