MVC 3分离实体正确保存相关的子项

时间:2011-10-12 21:34:46

标签: asp.net-mvc-3 model-view-controller ado.net linq-to-entities entity-framework-4.1

问题:

我需要将更新的分离EF对象保存到数据库中。

deatched实体是通过绑定基础实体创建的,然后是

  foreach child ...
     entity.children.add(child)

我添加了一个子实体数组,我也从控制器中的bind获得。

我想要的是旧实体完全被新实体取代,这意味着:

entity.property => update (easy)
entity.child => delete old child if not exists in the new,
                update if already exists (easy),
                or add if it doesnt exist already

到目前为止我所拥有的:

items tempitem = new items() { id = item.id };
_context.items.Attach(tempitem);
_context.items.ApplyCurrentValues(item);
foreach (var itemchild in item.children)
{
    childEntity tempchild= new childEntity () { parentid = item.id };
    _context.childEntity.Attach(tempchild);

    _context.childEntity.ApplyCurrentValues(itemchild );
}

这让我可以更新基本实体,并且还可以更新任何现有实体。

它不会让我删除旧实体 - 尝试做

item.children.Clear()

但没有任何反应,当我尝试添加一个新的子实体(绑定到分离的)时 - 也没有任何反应。

这不能太难,可以吗?我正在考虑转向NHibernate,在这里,事情似乎不那么臃肿,更直接但更强大......

1 个答案:

答案 0 :(得分:0)

基本上你必须从数据库中加载原始对象图(父所有子项,例如使用Include),否则EF无法知道哪些子项是新的,哪些已被删除。您必须通过将已加载的原始子集合与分离实体中的当前集合进行比较来添加或删除子项。

如何执行此操作的示例如下:https://stackoverflow.com/a/5540956/270591