«На объектный объект нельзя ссылаться несколькими экземплярами IEntityChangeTracker» - PullRequest
4 голосов
/ 22 августа 2011

У меня есть 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
    }
}

Вот мой код хранилища Vendors:

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);. И на всякий случай вот мой код репозитория регионов:

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 ]

11 голосов
/ 22 августа 2011

У вас есть два разных репозитория, каждый из которых имеет отдельный контекст данных - это корневая проблема - ваш контекст данных должен быть общим для всех ваших репозиториев, то есть вы можете внедрить его с помощью инжектора конструктора:

MyDBEntities entities = new MyDBEntities();
_vendorsRepository = new SqlVendorsRepository(entities);
_regionsRepository = new SqlRegionsRepository(entities);
2 голосов
/ 20 января 2015

Я столкнулся с той же ошибкой, когда у меня был слой Caching, который кэшировал объекты поиска и извлекал их из кэша.Кэшированные объекты были прокси-объектами и все еще имели ссылку на DBContext, который первоначально их извлек.

Основным признаком этого является то, что первое сохранение объекта Домена с поисковой ссылкой работало нормально, но последующие сохраненияне удалось.

Надеюсь, это кому-нибудь поможет, так как проблема заняла 2 дня моей жизни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...