c# - 如何删除对象状态管理器中的重复实体

标签 c# vb.net entity-framework

调用 AcceptChanges 时出现以下错误:

AcceptChanges 无法继续,因为对象的键值与 ObjectStateManager 中的另一个对象冲突。在调用 AcceptChanges 之前确保键值是唯一的。

现在我在网上搜索了很多,但没有找到我要找的答案。

我知道他们是有意设计的,因此您应该通过使用 ID 而不是实体对象来防止添加已存在的实体,但我无法做到这一点。

我有一个导入和导出,这是通用的,我可以提供任何实体对象,它将使其成为 xml 格式,反过来我可以提供任何 xml 并获得正确的实体。我无法使用序列化程序,因为我必须以自定义格式制作 xml。

问题在于,当我有更深的嵌套实体,这些实体本来可以在之前添加到主实体中时,我无法当场检查它,所以它们被添加了。导致同一实体可能被多次添加的问题。

当我更进一步并希望应用更改时,错误发生了。

现在考虑在防止“多次添加同一实体”的问题上我别无选择,我必须在添加它们之后处理它。

如何从 ObjectStateManager 中删除重复的实体,以便调用应用更改?

最佳答案

How can I delete duplicate entities from the ObjectStateManager, so that I can call apply changes?

只能手动搜索 ObjectStateManager 并解决重复项。这就是为什么您应该在将实体添加到 ObjectContext 或添加到 ObjectStateManager.ObjectStateManagerChanged 事件处理程序之前解决该问题。

不管怎样,你问错了问题。即使您从 ObjectStateManager 中删除重复的实体,也无法解决问题。删除实体只会破坏您的对象图。您还需要修复对已删除实体的所有引用,并将它们指向剩余的单个实体实例。

这个问题通常直接通过序列化/反序列化处理,如果你自己写,你也应该这样做。

关于c# - 如何删除对象状态管理器中的重复实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158865/

相关文章:

ASP.Net Entity Framework 存储库和 Linq

c# - 在资源中隐藏 App.config

c# - Xamarin 表单选取器中的 System.ArgumentOutOfRangeException

c# - Javascript 在 C# 中无效?

c# - 连续音生成

c# - ASP.NET 页面生命周期 : How Page. ProcessRequest 执行事件和内部方法?

linq - 如何在 Entity Framework 上应用全局过滤器?

vb.net - LINQ to Entities 无法识别方法 [Type] GetValue [Type]

mysql - Visual Studio 2013 连接到本地 MySQL 数据库

linq - 如何搜索 LINQ 表中的所有字段?