Entity framework 4 EF4自跟踪实体:删除标记后的OptimisticConcurrencyException

Entity framework 4 EF4自跟踪实体:删除标记后的OptimisticConcurrencyException,entity-framework-4,Entity Framework 4,我有一些需要克隆POCO实体图的逻辑,为此,我为每个T4生成的自跟踪实体创建了分部类,并在每个实体上实现了IClonable。每个实体都可以克隆自身,并在导航属性中遍历其所有子实体,并对每个子实体调用clone(),然后最终返回自身的克隆实例,并添加克隆的子实体。因此,这是一个深层次的克隆,效果很好。在克隆树中,所有实体都处于添加状态,这是有意义的…因为克隆图都是新实体 克隆进程在实体上下文中克隆服务端,虽然克隆进程本身不进行数据访问,但克隆是在从数据库中新检索到的图形上执行的(如果有更好的方法

我有一些需要克隆POCO实体图的逻辑,为此,我为每个T4生成的自跟踪实体创建了分部类,并在每个实体上实现了IClonable。每个实体都可以克隆自身,并在导航属性中遍历其所有子实体,并对每个子实体调用clone(),然后最终返回自身的克隆实例,并添加克隆的子实体。因此,这是一个深层次的克隆,效果很好。在克隆树中,所有实体都处于添加状态,这是有意义的…因为克隆图都是新实体

克隆进程在实体上下文中克隆服务端,虽然克隆进程本身不进行数据访问,但克隆是在从数据库中新检索到的图形上执行的(如果有更好的方法克隆实体图形,请随时通知我…)

现在,克隆的图形通过WCF发送到我们的Silverlight 4应用程序,并显示在那里。用户可以立即保存或添加/修改此图中的数据,然后将其保存回服务。如果从图中删除任何节点,则不会出现问题

当用户单击控件删除节点时,我通过调用MarkAsDeleted()更改实体图。这适用于未更改的图,但对于我的克隆图,所有内容都处于添加状态,在保存回WCF服务中的数据库时,我得到了一个OptimicConcurrencyException

Store update、insert或delete语句影响了意外的行数(0)。自加载实体后,实体可能已被修改或删除。请刷新ObjectStateManager条目

在我打电话的服务中

context.EntitySetX.ApplyChanges(entityNodeInTree)

SaveChanges()

除了这一个场景之外,这一切都很好。到目前为止,用户需要解决的问题是将克隆的图形保存回数据库,再次检索它(现在都将保持不变),然后删除他们想要的任何数据,最后再次保存

我不明白为什么会这样。是否无法将处于“添加”状态的内容标记为已删除?这对我来说真的没有意义,因为在使用Silverlight应用程序的过程中,有一些项目在图表中被添加,然后又被删除,这不会导致问题

有什么想法吗

谢谢

解决了

我遇到的问题是,在服务器端克隆过程中,新添加的实体被添加到另一个实体中,跟踪未打开,但在跟踪始终打开(由于反序列化打开跟踪)的客户端发生的删除被跟踪

关键是在克隆服务器端图形中的每个实体时打开跟踪。因此,当我“新建”一个实体时,我首先使用StartTracking方法打开实体的跟踪,然后再执行其他操作。这样,当我将克隆的子实体添加到克隆的父实体时,它已经处于跟踪模式


简而言之,在对自跟踪实体执行任何操作之前,请确保图形中的所有实体都已启用跟踪

错误消息的意思与它所说的完全相同。跟踪SQL。它没有达到框架所期望的效果。查看SQL应该有助于确定错误。SQL跟踪没有用处,因为没有生成SQL。这是一个实体框架STE问题。在尝试向数据库中插入任何内容之前发生并发异常。更新:只有在客户端执行MarkAsDeleted时才会发生问题(因此,在对整个图形进行反序列化之后,这会导致打开更改跟踪)。如果我在服务器端将MarkAsDeleted标记为已删除,然后将其保留回来,即使克隆和MarkAsDeleted是在实体上下文之外完成的,行为也会如预期的那样。