EF 4.2 DbContext多个IEntityChangeTracker实例问题
本文关键字:IEntityChangeTracker 实例 问题 多个 DbContext EF | 更新日期: 2023-09-27 17:51:16
我有一个EF数据存储模式,这是我从头开始设计的,当通过使用它的web应用程序使用EF时工作得很好,但是我的任务是生产我的系统的WCF API版本,它只在检索数据时工作得很好。
当我尝试创建新对象时(这些对象是在web服务方法中创建的,并且没有从请求序列化),我得到以下问题:
An entity object cannot be referenced by multiple instances of IEntityChangeTracker
现在我在开发系统时已经看到了这个问题,但这是因为我为每个调用创建了一个新的上下文,我通过将我的上下文扔到HttpContext.Current中来纠正这个问题。项目,正如我所说的在web应用程序中工作得很好,但现在当我调用代码给我Context时,HttpContext是Null(如预期的那样),因此代码将再次为方法内的每个调用生成一个新的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);
}
尝试正确处理上下文并测试错误是否消失,然后:
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);
}
}
当我发现这样的问题时,在我的情况下,我用由另一个上下文创建的实体填充了我的模型,所以我只是忽略了该实体并使用该Id再次重新创建它。只要确保在同一上下文中创建所有实体(包括嵌套实体)即可。