我有一个EF DataRepository模式,我是从头开始设计的,当通过使用它的Web应用程序使用EF时效果很好,但我的任务是生成我的系统的WCF API版本,它工作正常只检索数据时。
当我尝试创建新对象(这些是在Web服务方法中创建并且未从请求中进行了序列化)时,我遇到以下问题:
An entity object cannot be referenced by multiple instances of IEntityChangeTracker
现在我在开发系统时已经看到了这个,但这是因为我为每次调用创建了一个新的Context,我通过将我的上下文放入 HttpContext.Current.Items 来解决这个问题。正如我所说的在Web应用程序中工作得很好,但现在当我调用代码给我Context时,HttpContext是Null(如预期的那样),因此代码将再次为方法中的每个调用生成一个新的Context。
为了解决这个问题,我让服务提供商在初始化服务提供商时能够发送一个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 :(得分: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);
}
}
答案 1 :(得分:0)
当我发现这样的问题时,在我的情况下,我用另一个上下文创建的实体填写了我的模型,所以我只是忽略了该实体并使用该Id再次重新创建它。只需确保在同一个上下文中创建所有实体(包括嵌套)。