1

我有一个名为 Message 的模型。在模型中有另一个模型的ICollection ResourceSubscribers 称为Resource。当我尝试

public void SaveMessage(List<int> subscribers)
    {
        Condition.Requires(model).IsNotNull();
        Message model = new Message();

        //Some assignments to initialize the model

        ICollection<Resource> res = new List<Resource>();

        foreach (var item in subscribers)
        {
            res.Add(this.ResourceService.GetResourceById(item));
        }

        model.ResourceSubscribers = res;
        Context.Messages.Add(model);
        Context.SaveChanges();
    }

“Context.Messages.Add(model);” 行抛出 InvalidOperationException 并显示消息“IEntityChangeTracker 的多个实例无法引用实体对象。”。

4

3 回答 3

2

如果您在任何地方使用相同的上下文,最好将上下文用作单例实例。

这将确保一个类只有一个实例并提供一个全局访问点

检查这个: http: //www.dofactory.com/Patterns/PatternSingleton.aspx#_self1

于 2012-03-08T13:27:22.637 回答
0

这是一个老问题,但我想我会发布我的答案以防它帮助某人。

我在我的 MVC 代码中遇到了同样的问题,即使使用 Elad Benda 提到的工作单元模式。我发现我的 DbContext 资源在控制器调用结束时没有被释放。

    using (_DatabaseUow)
    {
        // your controller code that accesses the database here.
    } // When this goes out of scope dispose is called.

然后处理 DatabaseUnitOfWork 类

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing == true)
        {
            _ObdDbContext.DetachAll();
            _ObdDbContext = null;
            _ObdBusinessData = null;
        }
    }

    ~DatabaseUnitOfWork()
    {
        Dispose(false);
    }

_ObdBusinessData 成员类似于存储库。最后,DbContext 派生类中的 DetachAll() 方法如下所示:

    public void DetachAll()
    {
        var entries = SetTestsOnlineData.Local;
        while (entries.Count != 0)
        {
            TestsOnlineData tod = entries[0];
            Tests tro = entries[0].Tests;
            List<TestsDtc> dtcs = entries[0].Tests.TestsDtcs.ToList();

            foreach (TestsDtc dtc in dtcs)
                Detach(dtc);
            Detach(entries[0].Tests);
            Detach(entries[0]);

            tro.TestsDtcs = dtcs;
            tro.TestsOnlineData = tod;
            tod.Tests = tro;
        }
    }

    public void Detach(object entity)
    {
        ((IObjectContextAdapter)this).ObjectContext.Detach(entity);
    }

我使用我的实体/对象的特定知识来分离内存中的所有内容。我有一个名为 TestsOnlineData 的表。它链接到链接到 TestsDtc 列表的测试。请注意,我保留了这些链接关系,因为我的对象树的根将被保留,但 DbContext 将在它们分离时释放其他链接关系。

我本来想让它更通用,但这很有效。我希望这有帮助。

于 2014-10-09T16:41:05.690 回答
0

您是否使用另一个上下文GetResourceById来获取资源?在这种情况下,这些对象与该上下文相关联。这样做时,Context.Messages.Add您尝试将对象与另一个不允许的上下文相关联。

一起发生的所有相关操作都应使用相同的上下文。周围有多个上下文是在提出问题。

于 2011-10-29T07:01:56.190 回答