Entity Framework и Application Architecture (слабая связь и т. Д.)
Я планирую применить Entity Framework в новом проекте, потому что мне понравился его OR/M-API, а также возможности отображения концептуальной модели хранения (плюс, конечно же, Linq и Entity SQL).
Но как добиться слабой связи между уровнем пользовательского интерфейса и бизнес-уровнем, если в обоих случаях в качестве держателей данных используются объекты EF. Если я оставлю сущности прикрепленными к их ObjectContext, пока они находятся в пользовательском интерфейсе, пользовательский интерфейс может обойти бизнес-уровень и подключиться напрямую к базе данных. Если я отсоединю сущности от их ObjectContext перед передачей их в пользовательский интерфейс, отслеживание изменений не произойдет, поэтому мне придется "воспроизвести" все изменения на бизнес-уровне, чтобы они были сохранены в базе данных (трудно достичь, особенно с родительско-детские отношения). Хотя я не хочу, чтобы бизнес-уровень снизился до "движка объектов-дерева-персистентности", существуют сценарии, в которых полезно иметь эту возможность.
Это, безусловно, относится и к другим OR-картографам, но некоторые альтернативные продукты, похоже, имеют несколько лучшие механизмы отсоединения / присоединения.
4 ответа
"Воспроизвести" изменения проще, чем вы думаете. Вот общий план того, что вам нужно сделать:
- Сохраните "оригинальную" версию экземпляра объекта, прежде чем отсоединить его и передать в пользовательский интерфейс.
- Пусть пользовательский интерфейс делает свое дело.
- Если вы хотите сохранить изменения, сделанные пользовательским интерфейсом в базе данных, возьмите оригинальную версию, которую вы сохранили, и присоедините ее к EntityContext. Примените изменения от измененной версии, возвращенной пользовательским интерфейсом к этому экземпляру. Теперь SaveChanges. Entity Framework будет обрабатывать трехстороннее слияние.
Я не знаю ни одного ORM, который бы изящно работал с n-уровневыми решениями, где вы хотите иметь независимость от платформы. EF хорошо работает, когда все происходит внутри ObjectContext, когда у вас есть n-уровневое решение (физическое разделение, вызовы веб-службы WCF/XML), вам нужно выполнить некоторые операции, чтобы заставить объекты работать правильно.
Вы можете добиться слабой связи, используя шаблон Repository для разделения зависимостей API на Ef ( http://blog.keithpatton.com/2008/05/29/Polymorphic+Repository+For+ADONet+Entity+Framework.aspx), Однако, если вы используете свои классы EF непосредственно на уровне пользовательского интерфейса, вы будете зависеть от определенных типов, таких как EntityReference, EntityKey и EntityObject, если только вы не решите вникнуть в мир поведения EF с чистыми классами C# (POCO). что кажется больше проблем, чем оно того стоит для меня.
Даниэль Симмонс из команды ADO.Net дал метод расширения "AttachAsModified", чтобы прикрепить объект, который был изменен.
Это не так умно, как воспроизведение изменений, но это делает это: я использую это в пример проекта.
Google "Entity Framework" и "вотум недоверия" и посмотреть, что вы получите.