2011-02-26 45 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

相關問題