Я внедряю шаблон Repository (поверх Mongo DB) вместе с Unit of Work.
Добавление / обновление / удаление объектов из хранилища просто обновляет список (отслеживание) в памяти состояния объекта, который затем используется модулем работы в его методе SaveChanges()
для фактического выполнения операции CUD в базе данных.
Например, метод Repository.Add()
:
public void Add(TEntity entity)
{
TrackingList[entity] = new EntityData<TEntity>(entity, EntityState.Added);
}
Затем в единице работы SaveChanges()
реализация:
var addedEntities = repository.TrackingList.Values.Where(v => v.State == EntityState.Added).Select(v => v.Entity);
if (!addedEntities.Any())
return;
// inserts the added entities to the Mongo DB collection
repository.Collection.InsertMany(addedEntities);
Это работает при явном выполнении операции CUD для определенных объектов. Тогда я могу управлять этим списком отслеживания.
Но сейчас я пытаюсь реализовать следующий метод:
DeleteWhere(Expression<Func<Entity, bool>> filter);
Проблема в том, что я не могу отслеживать измененные сущности, так как я ничего не знаю о сущностях, которые пройдут фильтр.
Возможно, мне также придется поддерживать частичное обновление сущности с помощью фильтра.
Как правильно сделать это, если вообще возможно?