При удалении из репозитория модели (совокупный корень) все ассоциированные агрегаты также должны быть удалены.Паттерн репозитория: удаление корня заполнителя
Я изо всех сил, чтобы реализовать это в моем Entity Framework 6 реализации хранилища шаблона
В моем примере я хочу удалить Customer
из CustomerRepository
. Все объекты клиента Order
также должны быть удалены.
Repository (урезанная):
public interface IRepository<T> where T : DomainEntity
{
void Remove(T item);
}
public class EntityFrameworkRepository<T> : IRepository<T> where T : DomainEntity
{
private readonly DbSet<T> dbSet;
public DbContext context;
public EntityFrameworkRepository(IUnitOfWork unitOfWork)
{
context = entityFrameworkUnitOfWork.context;
dbSet = dbSet = context.Set<T>();
}
public virtual void Remove(T item)
{
DbEntityEntry dbEntityEntry = context.Entry(item);
if (dbEntityEntry.State == EntityState.Detached)
{
dbSet.Attach(item);
}
dbSet.Remove(item);
}
}
public class EntityFrameworkUnitOfWork : IUnitOfWork
{
public readonly DbContext context;
public EntityFrameworkUnitOfWork()
{
this.context = new ReleaseContext();
}
public void Commit()
{
context.SaveChanges();
}
}
ICustomerRepository
и CustomerRepository
(реализация EF):
public interface ICustomerRepository : IRepository<Customer>
{
IEnumerable<Customer> GetAllActive();
}
public class CustomerRepository : EntityFrameworkRepository<Customer>, ICustomerRepository
{
public CustomerRepository(IUnitOfWork unitOfWork)
: base(unitOfWork)
{ }
public override void Remove(Order item)
{
item.Orders.Clear();
base.Remove(item);
}
}
Клиент-код:
customerRepository.Remove(customer);
unitOfWork.Commit();
Исключение брошено:
System.InvalidOperationException: Операция не удалась: отношения не могут быть изменены, так как один или несколько из внешних ключей свойств не является обнуляемым. Когда происходит изменение отношения , соответствующее свойство внешнего ключа устанавливается в нулевое значение. Если внешний ключ не поддерживает нулевые значения, должно быть определено новое отношение , для свойства внешнего ключа должно быть назначено другое значение , или не связанный объект должен быть удален.
Я хотел бы позвонить только item.Orders.Clear()
, чтобы указать EF, что ассоциации должны быть удалены.
* «Все объекты Заказчика также должны быть удалены». * Woah there !! Подумайте об этом на секунду ... отменяет ли заказ только потому, что клиент удален? Даже исторические заказы? Следует удалить историю изменений клиента? Мне кажется, что 'Order' также должен быть агрегированным корнем, по крайней мере, в одном контексте. – MattDavey
@MattDavey: К сожалению, я должен был упомянуть, что это пример кода. Плохой пример, как вы указали. – davenewza
Я не верю, что реальный будет лучше. Жесткое удаление - это просто не путь DDD. –