我有一个EF DataRepository模式,我从头开始设计,在通过使用它的Web应用程序处理EF时工作得很好,但我一直负责生成WCF我的系统的API版本在只检索数据时工作正常。EF 4.2 DbContext IEntityChangeTracker的多个实例问题
当我尝试创建新的对象(这些Web服务方法中创建的,而不是从请求serilaized)我得到了以下问题:
An entity object cannot be referenced by multiple instances of IEntityChangeTracker
现在,我以前开发的时候看到了这一点系统,但这是因为我正在为每个调用创建一个新的上下文,我通过将我的上下文丢入HttpContext.Current.Items来解决这个问题,正如我所说的那样,在web应用程序中工作得很好,但现在当我打电话给代码给我的上下文,HttpContext是空的(如预期的),所以代码将再次为方法内的每个调用生成一个新的上下文。
为了解决这个问题,我给了服务提供者在初始化服务提供者时发送Context(作为参数)的能力。 然后我在方法的开始处声明Context,这意味着此方法中的所有调用都使用相同的上下文。
但我仍然得到同样的问题?
示例代码:
public MyObject DoSomething()
{
var dbContext = new myContext();
var foos = new FooHelper(dbContext).GetAllFoos();
var bah = new bah();
bah.Foo = foos.First();
bah.title = "youre a real object";
new bahHelper(dbContext).Create(bah);
}
这不会产生任何影响,因为错误发生在此方法中的Create之后。然而,我已经尝试在每次使用后添加dbContext.dispose(),这会返回相同的错误。 – JamesStuddart
@JamesStuddart:你知道错误信息的含义吗? “* IEntityChangeTracker *的多个实例”意味着涉及多个上下文实例,即有一个实体引用(未处置的)context1(POCO通常通过延迟加载或更改跟踪代理),并将此实体附加到上下文2。这不是你传递给'bahHelper'的上下文,它可能会导致麻烦,而是从前一个请求或处理中引用旧的上下文(隐藏在某个实体代理中)并且不会处理。所以,处置有所作为。 – Slauma
@JamesStuddart:如果您的代码不依赖于延迟加载或代理更改跟踪,您可以尝试禁用代理创建,例如在'MyContext'构造函数中:'this.Configuration.ProxyCreationEnabled = false;'。这将是有趣的,看看如果错误仍然存在... – Slauma