Шаблон репозитория - как объединить базы данных и объекты в памяти? - PullRequest
1 голос
/ 02 апреля 2019

Я внедряю шаблон репозитория и позволяю пользователю репозитория фильтровать, проецировать и сортировать данные, чтобы это было возможно, когда это возможно, на уровне базы данных. Когда пользователь добавляет / обновляет сущности, изменения вносятся в память до тех пор, пока не будет вызван метод Save () единицы работы, где все сущности сохраняются в базе данных.

Это интерфейс для части чтения сущностей в хранилище:

class MyEntity
{
    public int ID {get;set;}
    public string Name {get;set;}
}

interface IMyEntityRepository
{        
    IEnumerable<MyEntity> Get<TProjection>(Expression<Func<MyEntity, TProjection>> projection, Expression<Func<MyEntity, object>> sorting);
}

Вопрос в следующем: Скажем, пользователь хранилища добавляет сущность, а затем пытается извлечь объекты, проецируя и сортируя их:

using (var uow = CreateUnitOfWork())
{
    repository.Add(new MyEntity {ID = 1, Name = "Bob"});
    var result = repository.Get(projection: entity => entity.ID, sorting: entity => entity.Name);
    uow.Save();
}

Таким образом, после добавления () добавленная сущность все еще находится в памяти, поскольку единица работы еще не сохранена. Теперь пользователь запрашивает сущности, проецируя идентификатор, но сортируя по имени. Поскольку некоторые из объектов находятся в базе данных, а некоторые находятся в памяти, кажется, мне нужно объединить сортировку в базе данных и сортировку объектов в памяти. Как я смогу объединить базу данных и объекты в памяти, поскольку данные, извлеченные из базы данных с помощью проекции (только по идентификатору), не включают в себя ключ сортировки (имя)?

Редактировать: Поэтому я понимаю, что в этом случае объекты, добавленные, но еще не сохраненные, должны игнорироваться реализацией запросов к репозиторию. Но тот же вопрос все еще остается для сущностей, которые были сохранены, но кэшированы в хранилище. Как выполнить сортировку данных, которые частично кэшированы?

1 Ответ

2 голосов
/ 03 апреля 2019

Когда вы добавляете новый объект таким образом, на самом деле ничего не происходит, пока вы не запустите uow.Save();.

Проблема в том, что вы не можете использовать новый объект ни в какой операции, потому что вы не можете быть абсолютно уверены, что он будет добавлен в БД (он может пропустить какое-то обязательное свойство или некоторыеограничение внешнего ключа).


Решение состоит в том, чтобы сначала зафиксировать единицу работы, а затем выполнить любую нужную операцию.

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