Я знаю, что название звучит как дубликат нескольких существующих сообщений, но я прочитал немало из них, и моя ситуация на самом деле совсем другая. Я был бы очень признателен, если бы кто-нибудь, кто сталкивался с Entity Framework, мог предложить некоторые рекомендации по лучшей архитектуре для следующего сценария.Entity Framework с трехуровневой архитектурой, разными объектами по доменам
У меня есть приложение wpf с трехуровневой компоновкой, уровнем доступа к данным, бизнес-логикой и уровнем представления пользовательского интерфейса. Пользовательский интерфейс использует MVVM. DAL использует Entity Framework. Пользовательский интерфейс и уровень доступа к данным имеют свои собственные модели, UIModel и DataModel.
В текущем проекте используется глобальная платформа DbContext для Entity Framework в приложении. Для простой операции обновления объект извлекается из базы данных в виде DataModel, преобразуется в GUIModel, подключается к ViewModel и View для обновлений и преобразуется обратно в DataModel для обновления в базе данных. И вот проблема: когда новый DataModel создается из преобразования, он больше не связан с исходным объектом, и Entity Framework не может выполнить обновление, поскольку теперь он имеет две повторяющиеся модели одного и того же первичного ключа, подключенного к одному и тому же DbContext ,
Я сделал несколько исследований и нашел пару возможных способов исправить это. Один из них состоит в том, чтобы использовать единый модельный объект для всех слоев вместо разделения GUIModel и DataModel и разбивать глобальный DbContext на единицу работы. Это, по-видимому, очень общий дизайн, но мои проблемы с этим подходом заключаются в том, что слияние GUIModel и DataModel нарушает разделение обязанностей, а для использования единицы работы требуется Business Layer для управления временем жизни DbContext, что также размывает границу между BLL и DAL.
Второй вариант заключается в использовании локального DbContext для каждого запроса базы данных с блоком using
. Это, пожалуй, большая эффективность памяти. Но делать это таким образом делает ленивую загрузку невозможной, и яростная загрузка всех свойств навигации в каждом запросе может повлиять на производительность. Также краткосрочные DbContexts требуют полной работы в отключенном графике, что становится довольно сложным с точки зрения отслеживания изменений.
Третьей возможностью было бы кэширование всех исходных DataModels и обновление этих объектов после обновления.
Я новичок в платформе Entity Framework, и я уверен, что должны быть и другие способы исправить эту проблему. Я буду очень признателен, если кто-нибудь может предложить некоторые идеи относительно наилучшего подхода к этому.