Мне нравится иметь слой хранилища по следующим причинам:
EF Готча
Когда вы смотрите на некоторые текущие учебные пособия по EF (версия Code First), становится очевидным, что нужно обработать ряд ошибок, особенно в отношении графов объектов (объектов, содержащих объекты) и отключенных сценариев. Я думаю, что слой репозитория отлично подходит для упаковки их в одном месте.
Четкая картина механизмов доступа к данным
Репозиторий дает конкретную картину того, как BL получает доступ и обновляет хранилище данных. Он раскрывает методы, которые имеют четкое единственное назначение и могут быть протестированы независимо от BL. Стандартный пример из учебников, Find () , чтобы найти одну сущность. Более конкретный пример приложения Clear () для очистки таблицы базы данных.
Место для оптимизации
При использовании vanilla EF вы неизбежно сталкиваетесь с падениями производительности. Я использую хранилище, чтобы скрыть механизмы оптимизации от BL.
Примеры,
GetKeys () для проецирования кэшированных ключей из таблиц (для решений о вставке / обновлении). Чтение только ключа происходит быстрее и использует меньше памяти, чем чтение полной сущности.
Массовая загрузка через SqlBulkCopy. EF будет вставлять по отдельным операторам SQL. Если вы хотите, чтобы один оператор вставлял несколько строк, SqlBulkCopy - хороший механизм. Хранилище инкапсулирует это и предоставляет метаданные для SqlBulkCopy. Как и метод Insert, вам нужен метод StartBatch () и EndBatch (), который также является аргументом для слоя UnitOfWork.