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

时间:2011-08-22 19:48:31

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-3

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

Vendors
-------------------
VendorID (PK)
Name

Regions
-------------------
RegionID (PK)
Name

VendorRegions
-------------------
VendorID (PK)
RegionID (PK)

在我创建供应商的页面上,我列出了一个复选框列表中的每个区域。对于每个要检查的区域,我想将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<Region> Regions
    {
        get { return _entities.Regions.AsQueryable(); }
    }


    public Region GetRegion(int id)
    {
        return Regions.FirstOrDefault(st => st.RegionID == id);
    }
}

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

2 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:2)

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

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

我希望这对某人有所帮助,因为问题花了我两天的时间。