Я разрабатываю приложение MVC. У меня есть модель домена, и я использую шаблон репозитория для доступа к данным и Entity Framework Code First. У меня также есть класс UnitOfWork, через который я вызываю операции с репозиторием.
Моя проблема в основном возникает, когда я пытаюсь воспользоваться преимуществами агрегированных корней и обрабатывать дочерние объекты через их родительский репозиторий.
Это проблема: у родительского класса «Поставщик» есть несколько контрактов с отделами. В этом случае я решил сделать контракт дочерним по отношению к поставщику.
Чтобы добавить новый контракт, мне нужно добавить метод для добавления контракта в мой SupplierRepository, я попробовал:
public class SupplierRepository : GenericRepository<Supplier>
{
public SupplierRepository(MyContext context)
: base(context)
{
}
public void AddSupplierContract(SupplierContract contract)
{
var supplier = context.Suppliers.Find(contract.SupplierId);
supplier.Contract.Add(contract);
}
И еще я пробовал:
public void AddSupplierContract(SupplierContract contract)
{
context.Entry(contract).State = EntityState.Added;
}
}
Когда я звоню
_unitOfWork.save();
Я получаю сообщение об ошибке:
На объект сущности не могут ссылаться несколько экземпляров IEntityChangeTracker
UnitOfWork создает мой DbContext (myDbContext) и мой SupplierRepository и вызывает myDbContext.Save ()
- Почему у меня такое поведение
- Как мне реализовать агрегированный корневой репозиторий (операции CRUD для дочерних объектов)
Насколько я понимаю, у меня должен быть метод в репозитории, который берет контракт и добавляет его, а не делает это в контроллере моего приложения MVC, но мне кажется, что он не работает.
Я видел много информации об агрегированных корнях, но не видел примеров того, как это реализовать.
Спасибо.
Решение:
Ну наконец-то я разобрался.
Таким образом, это не было проблемой с репозиторием, но новый SupplierContract запросил у хранилища пользовательский объект, который его создал (с помощью метода расширения). Очевидно, этот контекст не был удален, и поэтому у меня было два текущих DbContexts, когда я создал его для сохранения объекта контракта.
Надеюсь, кто-то сэкономит время, прочитав это.
Репозиторий Aggregate Root, который я решил, просто сделав это в SupplierRepository:
public void AddSupplierContract(SupplierContract contract)
{
db.SupplierContracts.Add(contract);
}
И вызов метода UnitOfWork.Save ().