Asp.net mvc 3 MVC 3分离实体正确保存相关子项

Asp.net mvc 3 MVC 3分离实体正确保存相关子项,asp.net-mvc-3,model-view-controller,ado.net,linq-to-entities,entity-framework-4.1,Asp.net Mvc 3,Model View Controller,Ado.net,Linq To Entities,Entity Framework 4.1,问题: 我需要将更新的分离EF对象保存到数据库中 取消匹配的实体是通过绑定基础实体创建的,然后 foreach child ... entity.children.add(child) 我添加了一个子实体数组,这些子实体也是从绑定控制器中获取的 我想要的是旧实体被新实体完全取代,这意味着: entity.property => update (easy) entity.child => delete old child if not exists in the new

问题:

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

取消匹配的实体是通过绑定基础实体创建的,然后

  foreach child ...
     entity.children.add(child)
我添加了一个子实体数组,这些子实体也是从绑定控制器中获取的

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

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,它看起来不那么臃肿,更简单但功能强大……

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


下面是一个例子:

我不知道这里发生了什么。我在我的答案下面看到了你的评论,并在下面写了我自己的评论(说我没有删除任何答案(我不能删除答案),昨天我回答时这里根本没有答案)。现在两条评论都不见了。我不知道为什么。我猜你之所以投了否决票,是因为你觉得我删除了其他答案,所以很生气。我只能告诉你,我只是写了我的答案,我就这么做了。我把这个带给了梅塔:。他们说这里没有删除的答案。如果你绝对确定你已经在这里提交了你自己的答案,这里还有其他答案,你应该在Meta上描述这是一个可能的错误。你好,很抱歉当时的反应,我以为是你做的。很明显,这些评论也被删除了,所以有些地方很不对劲。我也会在meta注册,等我有更多时间的时候再继续。有可能评论已经被版主删除了。但是版主不能以一种对信誉>10k的用户不可见的方式删除答案(这是他们在Meta上向我解释的)。但这里没有我自己的答案,也没有删除的答案。这就是奇怪的事情。如果你提交了一个答案,那么就有问题了。我明白了,实际上有两个答案,一个是我的,另一个也是非常好的答案,但并不完整