Entity Framework и архитектура приложения (слабая связь и т. Д.) - PullRequest
2 голосов
/ 17 сентября 2008

Я планирую применить Entity Framework в новом проекте, потому что мне понравился его OR / M-API, а также возможности отображения концептуальной модели хранилища (плюс, конечно же, Linq и Entity SQL).

Но как добиться слабой связи между уровнем пользовательского интерфейса и бизнес-уровнем, если объекты EF используются в качестве держателей данных в обоих. Если я оставлю сущности прикрепленными к их ObjectContext, пока они находятся в пользовательском интерфейсе, пользовательский интерфейс может обойти бизнес-уровень и подключиться напрямую к базе данных. Если я отсоединю сущности от их ObjectContext перед передачей их в пользовательский интерфейс, отслеживание изменений не произойдет, поэтому мне придется «воспроизвести» все изменения на бизнес-уровне, чтобы они были сохранены в базе данных (трудно достичь, особенно с родительско-детские отношения). Хотя я не хочу, чтобы бизнес-уровень снизился до «движка объектов-дерева-персистентности», существуют сценарии, в которых полезно иметь эту возможность.

Это, безусловно, относится и к другим OR-картографам, но некоторые альтернативные продукты, похоже, имеют несколько лучшие механизмы отсоединения / присоединения.

Ответы [ 4 ]

4 голосов
/ 18 сентября 2008

«Воспроизвести» изменения проще, чем вы думаете. Вот общий план того, что вам нужно сделать:

  1. Сохраните «оригинальную» версию экземпляра сущности, прежде чем отсоединить его и передать в пользовательский интерфейс.
  2. Пусть пользовательский интерфейс сделает свое дело.
  3. Если вы хотите сохранить изменения, сделанные пользовательским интерфейсом в базе данных, возьмите оригинальную сохраненную версию и присоедините ее к EntityContext. Примените изменения от измененной версии, возвращенной пользовательским интерфейсом к этому экземпляру. Теперь SaveChanges. Entity Framework будет обрабатывать трехстороннее слияние.
3 голосов
/ 07 октября 2008

Я не знаю ни одного 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), что кажется мне более трудным, чем оно того стоит.

0 голосов
/ 06 января 2009

Даниэль Симмонс, из команды ADO.Net, дал метод расширения «AttachAsModified» , чтобы прикрепить объект, который был изменен.

Это не так умно, как воспроизведение изменений, но это делает это: я использую его в пример проекта.

0 голосов
/ 17 сентября 2008

Google "Entity Framework" и "вотум недоверия" и посмотреть, что вы получите.

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