Я использую контекстную область Mehdime везде, где могу, так как я обнаружил, что это исключительная реализация единицы работы. Я согласен с комментарием Камило о ненужном разделении. Если EF доверяют служить в качестве вашего DAL, то ему следует доверять, чтобы он работал так, как задумано, чтобы вы могли полностью его использовать.
В моем случае мои контроллеры управляют DbContextScope, и я использую шаблон репозитория в сочетании с дизайном DDD для моих сущностей. Репозиторий служит привратником для взаимодействия с контекстом, находящимся в области видимости и расположенным с помощью DbContextLocator. Когда дело доходит до создания сущностей, хранилище служит фабрикой с методом «Create {X}», где {X} представляет сущность. Это гарантирует, что вся необходимая информация, необходимая для создания объекта, предоставлена, и объект связан с DbContext перед его возвращением, так что объект гарантированно всегда будет в допустимом состоянии. Это означает, что в контексте вызова контекста SaveChanges у ограничивающей службы автоматически появляется объект с назначенным ему идентификатором. ViewModels / DTO - это то, что контроллер возвращает потребителю. У вас также есть возможность вызвать SaveChanges DbContext в пределах границы DbContextScope, которая также покажет идентификаторы до контекста контекста SaveChanges. Это более точный сценарий, когда вы хотите получить идентификатор для слабосвязанных объектов. (Нет связи FK / сопоставлено). Хранилище также обслуживает код «Удалить», чтобы обеспечить управление всеми связанными объектами, правилами и тому подобным. В то время как редактирование сущностей подпадает под методы DDD для самой сущности.
Может быть более пуристический аргумент, что это «пропускает» детали домена или специфические проблемы EF в контроллер, но мое личное мнение заключается в том, что преимущества «доверяющих» сущностей и EF в рамках ограниченного контекста внутри уровень обслуживания далеко, далеко перевешивает все остальное. Это проще и дает вам большую гибкость в вашем коде без необходимости почти дублирующих методов, распространяющихся для предоставления потребителям отфильтрованных данных, или сложной логики фильтрации, чтобы «скрыть» EF от уровня обслуживания. Основное правило, которому я следую, заключается в том, что сущности никогда не возвращаются за пределы их контекста. (Нет отсоединения / повторного присоединения, просто выберите в ViewModels и управляйте созданием / обновлением / удалением объектов на основе переданных в представлении моделей / параметров.)
Если есть более конкретные проблемы / примеры, которые вы можете предоставить, пожалуйста, не стесняйтесь добавлять код, описывающий, где вы видите эти проблемы.