2013-01-10 20 views
2

我有一个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); 
} 

回答

0

尝试配置正确的环境和测试,如果再错误消失:

public MyObject DoSomething() 
{ 
    using (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); 
    } 
} 
+0

这不会产生任何影响,因为错误发生在此方法中的Create之后。然而,我已经尝试在每次使用后添加dbContext.dispose(),这会返回相同的错误。 – JamesStuddart

+0

@JamesStuddart:你知道错误信息的含义吗? “* IEntityChangeTracker *的多个实例”意味着涉及多个上下文实例,即有一个实体引用(未处置的)context1(POCO通常通过延迟加载或更改跟踪代理),并将此实体附加到上下文2。这不是你传递给'bahHelper'的上下文,它可能会导致麻烦,而是从前一个请求或处理中引用旧的上下文(隐藏在某个实体代理中)并且不会处理。所以,处置有所作为。 – Slauma

+0

@JamesStuddart:如果您的代码不依赖于延迟加载或代理更改跟踪,您可以尝试禁用代理创建,例如在'MyContext'构造函数中:'this.Configuration.ProxyCreationEnabled = false;'。这将是有趣的,看看如果错误仍然存​​在... – Slauma

0

当我发现这样的问题,在我来说,我填写了我的模型由另一个上下文创建的实体,所以我只是忽略该实体并使用该Id重新创建它。只要确保你在同一个上下文中创建了所有的实体(包括嵌套)。

相关问题