Entity framework 实体框架-更新大型实体图

Entity framework 实体框架-更新大型实体图,entity-framework,Entity Framework,我有一个很大的实体“图”,我以一种断开连接的方式处理这些实体。它们是POCO实体,实现我自己的简单更改跟踪标志(IsNew、IsChanged、IsDeleted)。当需要保存更改时,我将整个图表传递回业务层,该层执行以下操作:- context.Batches.Attach(batch); 其中,batch是图形层次结构最顶层的实体。这有一个“级联效应”,并附加图形中的所有实体,这些实体最终都处于不变状态。然后,根据更改跟踪标志的值,通过ObjectStateManager,遍历设置每个实体

我有一个很大的实体“图”,我以一种断开连接的方式处理这些实体。它们是POCO实体,实现我自己的简单更改跟踪标志(IsNew、IsChanged、IsDeleted)。当需要保存更改时,我将整个图表传递回业务层,该层执行以下操作:-

context.Batches.Attach(batch);
其中,
batch
是图形层次结构最顶层的实体。这有一个“级联效应”,并附加图形中的所有实体,这些实体最终都处于不变状态。然后,根据更改跟踪标志的值,通过
ObjectStateManager
,遍历设置每个实体状态的层次结构

这种方法的问题是需要为新实体分配唯一的ID(尽管是“标识”列)。我不能将它们全部保留为0,否则
附加
将失败,并显示消息“已存在具有相同密钥的对象…”

必须分配临时的、唯一的ID开始变得有点混乱,我想知道是否有更好的解决方案。我想知道我是否可以遍历图表,一次添加一个实体(基于我的更改跟踪标志),然后执行
附加
添加
,但这似乎是不可能的,因为这两种方法都“级联”,导致所有子实体也被添加或附加。这有什么办法吗


如果有区别的话,我使用的是EF5,ObjectContext模板。

首先从上下文中获取当前实体图(启用了
更改跟踪和
代理生成
),然后遍历每个节点并基于分离的图更新/删除/添加数据会容易得多(使用您自己的内部持久性状态字段).

您是否尝试添加而不是附加,然后更改实体的状态。我认为问题来自附加时的初始状态。初始状态不变。因此,在未更改状态下不能有两个具有相同id的相同类型的实体。@tschmit007是的,这是我的另一个想法。不幸的是,图表中包含qui删除与“引用/查找”实体的一些关系,因此我需要将它们的状态设置为“未更改”,从而增加我必须执行的图形“漫游”量。我认为这是一个必要的缺点。所以要“添加”,我只需将新的分离实体传递给上下文。Whatevers.Add()?关于“删除”呢-我可以将分离的实体传递给context.Whatevers.Delete()吗?还是必须使用键来完成(如果是,如何完成)?更新呢?如何更新“当前”中的实体从分离图中的实体创建图?这实际上取决于实体的结构,如果您公开更多的代码,我可以提供更多帮助。顺便说一句,奇怪的是,当我看到您的评论时,我刚刚下载了GraphDiff。我不久前尝试了它,但有点问题。他们最近修复了我发现的一些问题,所以我不会首先检查一下这条路线,看看我是怎么走的。GraphDiff似乎还是有点问题。为了保持系统简单,我现在恢复到“附加”方法,在用户编辑期间保持上下文的活动状态。代码简单得多(我可以去掉所有我通常忘记设置的“更改跟踪”标志),而且我不必担心忽略标记为删除的实体(我通常也会忘记这样做)。唯一的缺点是,对于将来分发层的任何机会,我都会如履薄冰,但我会抓住这个机会。