“IEntityChangeTracker的多个实例无法引用实体对象”

我有3个数据库表:Vendors,Regions和VendorRegions:

Vendors ------------------- VendorID (PK) Name Regions ------------------- RegionID (PK) Name VendorRegions ------------------- VendorID (PK) RegionID (PK) 

在我创建供应商的页面上,我列出了一个复选框列表中的每个Region。 对于每个检查的区域,我想将VendorID和RegionID添加到VendorRegions表。

我正在使用Entity Framework,C#和MVC 3。

这是我的控制器代码:

 public class VendorsController : Controller { readonly IVendorsRepository _vendorsRepository; readonly IRegionsRepository _regionsRepository; public VendorsController() { _vendorsRepository = new SqlVendorsRepository(); _regionsRepository = new SqlRegionsRepository(); } [HttpPost] public ActionResult Create(VendorViewModel viewModel, string[] Regions) { var vendor = new Vendor(); TryUpdateModel(vendor); if (ModelState.IsValid) { vendor.Regions.Clear(); foreach (var regionId in Regions) { vendor.Regions.Add(_regionsRepository.GetRegion(Int32.Parse(regionId))); } _vendorsRepository.SaveVendor(vendor); return RedirectToAction("Index"); } return View(viewModel); // validation error, so redisplay same view } } 

这是我的供应商存储库代码:

 public class SqlVendorsRepository : IVendorsRepository { private readonly MyDBEntities _entities; public SqlVendorsRepository() { _entities = new MyDBEntities(); } public void SaveVendor(Vendor vendor) { // If it's a new vendor, just attach it to the DataContext if (vendor.VendorID == 0) _entities.Vendors.Context.AddObject("Vendors", vendor); // ERROR HERE else if (vendor.EntityState == EntityState.Detached) { // We're updating an existing vendor, but it's not attached to this data context, so attach it and detect the changes _entities.Vendors.Context.Attach(vendor); _entities.Vendors.Context.Refresh(System.Data.Objects.RefreshMode.ClientWins, vendor); } _entities.Vendors.Context.SaveChanges(); } } 

当我尝试保存我的供应商时出现错误,发生在_entities.Vendors.Context.AddObject("Vendors", vendor); 。 以防万一,这是我的Regions存储库代码:

 public class SqlRegionsRepository : IRegionsRepository { private readonly MyDBEntities _entities; public SqlRegionsRepository() { _entities = new MyDBEntities(); } public IQueryable Regions { get { return _entities.Regions.AsQueryable(); } } public Region GetRegion(int id) { return Regions.FirstOrDefault(st => st.RegionID == id); } } 

这似乎是一件简单的事情,但我不知道如何克服这个错误。 有任何想法吗?

您有两个不同的存储库,每个存储库都有一个单独的数据上下文 – 这是根本问题 – 您的数据上下文应该由您的所有存储库共享,即您可以通过构造函数注入注入它:

 MyDBEntities entities = new MyDBEntities(); _vendorsRepository = new SqlVendorsRepository(entities); _regionsRepository = new SqlRegionsRepository(entities); 

当我有一个缓存查找实体并从缓存中检索它们的缓存层时,我遇到了同样的错误。 缓存的实体是代理实体,并且仍然具有对最初检索它们的DBContext的引用。

这主要的症状是具有查找引用的Domain实体的第一次保存工作正常,但后续保存失败。

我希望这有助于某人,因为这个问题花了我2天的时间。