【问题标题】:C# Entity Framework "An entity object cannot be referenced by multiple instances of IEntityChangeTracker"C# Entity Framework “一个实体对象不能被多个 IEntityChangeTracker 实例引用”
【发布时间】:2011-07-04 22:37:29
【问题描述】:

这个错误抛出了很多,但我找不到解决办法。我是实体框架的新手,在我的第一种方法中我遇到了这个错误。

这就是我所拥有的。我有一个公司班和一个分公司班。这两个类都有自己的存储库。一个公司有一个分公司,一个分公司可以有多个公司。

在我的 GUI 中,我使用从 BranchRepository 获取的 Branch 对象填充组合:

    public IList<Branch> GetAllBranches()
    {
        var query = _context.Branches;

        IList<Branch> branches = query.ToList();

        return branches;
    }

这是结果是分支组合框的数据源。

当我想拯救公司时,我会这样做:

company.VisitorAddress = txtVisitAddress.Text;
company.City = txtCity.Text;
company.CompanyName = txtCompany.Text;
company.PhoneNumber = txtPhoneNumber.Text;
company.ZipCode = txtZipcode.Text;
company.Branch = ((Branch)cmbBranches.SelectedItem);
company.Website = txtWebsite.Text;

然后,我调用我的公司存储库来保存我的公司。保存方法如下所示:

public bool Save(Company company)
{
    _context.AddToCompanies(company);   // <-- This is where the error is thrown.
    _context.SaveChanges();

    return true;
}

当调用 save 方法时,我收到错误“一个实体对象不能被多个 IEntityChangeTracker 实例引用”。

显然我做错了什么,但是什么?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    您是否为每个存储库创建新的ObjectContext 实例?这可能是问题的根源,因为当您将 Branche 添加到 Company 时,它会尝试将其添加到 ObjectContext 实例,这是无法完成的,因为它仍然与用于填充组合框的 ObjectContext 实例相关。要走的路是在您的存储库之间共享ObjectContext 实例。其他可能性是 Detach 从第一个存储库分支,但它可能有其他后果。

    【讨论】:

    • 是的,每个存储库都有自己的ObjectContext 。那么我怎样才能以一种简洁的方式分享ObjectContext?使用单例是个好方法吗?
    • 没有单例不是一个好方法 - 在这里查看我的答案:stackoverflow.com/questions/3653009/… 可以将 ObjectContext 实例传递给存储库的构造函数,但是您必须在存储库之外处理 SaveChanges。
    • 我正在使用 winforms。但我看不到如何共享“ObjectContext”。我不希望客户知道这种情况。
    • 您已经在使用存储库模式。此模式通常与 UnitOfWork 模式一起使用。工作单元包装了 ObjectContext 并能够调用 Save。所有存储库都接收 UnitOfWork 实例作为构造函数参数以访问 ObjectContext。
    • 我不明白。你能提供一些(虚拟)代码来解释这一切吗?
    猜你喜欢
    • 2010-10-16
    • 2011-11-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多