2

我有一个 EF DataRepository 模式,它是我从头开始设计的,在通过使用它的 Web 应用程序使用 EF 时效果很好,但我的任务是生成我的系统的 WCF API 版本,该版本仅在检索时运行良好数据。

当我尝试创建新对象时(这些对象是在 Web 服务方法中创建的,并且没有从请求中序列化),我遇到以下问题:

An entity object cannot be referenced by multiple instances of IEntityChangeTracker

现在我以前在开发系统时已经看到了这一点,但这是因为我为每次调用创建了一个新的上下文,我通过将我的上下文放入HttpContext.Current.Items来解决这个问题,正如我所说的那样在 Web 应用程序中效果很好,但是现在当我调用代码给我上下文时,HttpContext 为 Null(如预期的那样),因此代码将再次为方法中的每个调用生成一个新的上下文。

为了解决这个问题,我让我的服务提供者能够在初始化服务提供者时发送一个上下文(作为参数)。然后,我在方法的开头声明 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);
}
4

2 回答 2

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);
    }
}
于 2013-01-10T17:03:32.403 回答
0

当我发现这样的问题时,就我而言,我使用由另一个上下文创建的实体填充了我的模型,所以我只是忽略了该实体并使用该 ID 再次重新创建它。只需确保在同一上下文中创建所有实体(包括嵌套实体)。

于 2013-03-02T21:43:06.907 回答