2011-02-26 49 views
20

这个错误引发了很多,但我找不到解决方案。我是新来的实体框架,并在我的第一个方法,我得到了这个错误。C#实体框架“一个实体对象不能被IEntityChangeTracker的多个实例引用”

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

在我的GUI我填一个组合与分公司的对象,这是我从我的BranchRepository得到:

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; 
} 

当调用保存方法,我得到的错误“一个实体对象不能被IEntityChangeTracker的多个实例引用”。

很明显我做错了什么,但是什么?

回答

22

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

+0

是的,每个存储库都有它自己的'ObjectContext'。那么我怎样才能以一种整洁的方式共享'ObjectContext'?使用单身人士是一个好方法吗? – Martijn 2011-02-26 17:12:01

+0

没有单身人士不是一个好方法 - 在这里检查我的答案:http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392要走的路可以传递ObjectContext实例到存储库构造函数,但是您必须在存储库之外处理SaveChanges。 – 2011-02-26 17:15:13

+0

我正在使用winforms。但我不知道如何分享'ObjectContext'。我不希望客户意识到这种情况。 – Martijn 2011-02-26 17:20:02

相关问题