EF 4.2 DbContext IEntityChangeTracker问题的多个实例

时间:2013-01-10 13:15:05

标签: c# entity-framework

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

2 个答案:

答案 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再次重新创建它。只需确保在同一个上下文中创建所有实体(包括嵌套)。