【问题标题】:EF4 can’t add an object to the context even though I’m convinced it is not attached即使我确信它没有附加,EF4 也无法将对象添加到上下文中
【发布时间】:2011-12-28 19:29:57
【问题描述】:

我无法将对象添加到 ObjectContext,即使我确信它没有附加并且它没有与不同的上下文相关联

我正在使用带有 POCO 对象的 EF 4。

如果我尝试

_currentContext.ObjectStateManager.GetObjectStateEntry(entityIn)

然后我得到错误

The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 'System.Data.Entity.DynamicProxies.OrderItem_7D361CB49D75AA90681B4BA3F924139ECB0FC1426E38E90C7B884A4E9CD777DF'.

很公平,它不存在。所以如果我尝试附加它

_currentContext.AttachTo("OrderItems", entityIn)

然后我得到

An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

我怎么会同时出现这两个错误。他们不矛盾吗??如何将其附加到上下文中?

编辑

整个应用程序只有一个上下文。模式是

  1. 通过存储库对象的所有调用。
  2. 对象从工厂类中获取其对象上下文。
  3. 这个工厂类要么创建上下文,要么从请求对象中获取上下文,从而保证页面生命周期只使用一个上下文

在任何时候,如果您对上下文对象进行两个实例化,则每个实例的哈希码都是相同的。

【问题讨论】:

  • 您尝试附加的 OrderItem 是否引用了一个订单(或另一个实体)并且已经附加了具有相同密钥的订单?那么它可能是这样的问题:stackoverflow.com/questions/7938728/…
  • Order @Slauma 的猜测不错。你见过我的模式吗(笑话)。大概就是这样,谢谢。但是鉴于这种情况,如果基础订单已经附加并且会导致此问题,我该如何附加订单项目。我错过了一些明显的东西吗?
  • 如果附加的Order 和OrderItem 引用的Order 是同一个对象就没有问题。但是此错误表明您有一个附加的 Order (hash=x, key=1) 和另一个具有相同键 (hash=y, key=1) 的 Order 对象。如果你有这个,你基本上必须用附加的 Order 替换分离的 Order(由 OrderItem 引用),或者在附加之前将 OrderItem 对 Order 的引用设置为 null。我的猜测也可能是错误的,我不确定这个关于IEntityChangeTracker 多个实例的错误是否与我链接的答案的原因相同。
  • 再次感谢您。当我将任何填充的导航属性设置为空时,它会出错。我会继续调查谢谢
  • 也许你不允许你的外键可以为空。也就是说,不要将对象设置为导航属性,而是设置相应的 ID 字段。

标签: c# asp.net entity-framework poco objectcontext


【解决方案1】:

对象entityIn 可能引用了另一个上下文中的对象。

然而,真正的 问题是你在范围内有多个上下文要做到这一点很难。在 Web 应用程序中,每个请求应该有一个上下文,周期。

【讨论】:

  • 我使用 Ninject 为我的所有存储库的每个请求提供一个上下文。奇迹般有效。不过,任何 IoC 容器都应该完成这项工作。
  • 感谢您的评论@Craig Stuntz。正如您所建议的,在应用程序中,只有一个与请求对象关联的上下文。我已经编辑了问题以使其更清楚
  • 如果您收到“通过多个 IEntityChangeTracker 实例”错误,那么您确实涉及多个上下文,句号。该错误并不意味着还要别的吗;只有一件事导致它。只是在另一个上下文中的对象不是entityIn;这是entityIn 关联的某个对象。
  • 好吧,我承认你是对的@Craig Stuntz,尽管我花了很长时间才意识到这一点。尽管上下文是通过工厂方法提供的,并且每个请求只有一个上下文,但问题是我有一个实体保存到会话中,正是这个导致了这个错误。从中吸取的教训是不要将实体保存到会话中,因为它们会导致代码像这样爆炸
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
相关资源
最近更新 更多