Общие сущности в модели Entity Framework

У меня есть 3 (в будущем, возможно, больше) больших проектов, которые сильно отличаются друг от друга, однако есть около 15+ таблиц, которые все они имеют общие (User , роль, пользовательские настройки, пользовательский журнал и т. д.). Любые изменения в этих общих таблицах, а также изменения в сущностях всегда применяются ко всем проектам.

На данный момент у каждого проекта есть отдельный EDMX, который дублирует эти объекты для каждого проекта. Любое изменение в этих общих сущностях или таблицах требует повторения одних и тех же изменений 3 раза.

Есть ли способ определить эти объекты в отдельном проекте, а затем reuse их в каждом проекте?

Имейте в виду, что эти общие объекты имеют отношения с другими объектами в каждом проекте (это информация, специфичная для каждого проекта).

Я хотел бы сделать в EDMX ссылку на объект (из другого EDMX), а не просто tables/views/sps (что, насколько я могу судить, невозможно).

Примечание. Я нашел несколько старых блогов на ADO.NET, но пока не нашел реального решения.


person Andrej Kovacik    schedule 09.01.2013    source источник


Ответы (2)


Я бы создал API для общих ресурсов, и каждый проект, нуждающийся в них, мог бы использовать API. Общие ресурсы будут иметь свой собственный проект и 1 edmx для этих объектов. Таким образом, вы всегда вносите изменения в эти общие ресурсы один раз, и все три получают обновление. Недостатком является то, что вы не можете вносить эти изменения по одному, как сейчас, однако я бы очень поддержал простоту обслуживания и сокращение дублированного кода!

У меня есть аналогичная настройка с OData, и она отлично работает! конечно, это было до того, как MS выпустила новую архитектуру веб-API. Вот краткое руководство по этому вопросу (http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api)

person OnResolve    schedule 09.01.2013
comment
Как бы вы затем создали отношения между сущностями и API? - person Andrej Kovacik; 10.01.2013
comment
Как я уже сказал, я использую OData, так что это просто ссылка на службу; и в зависимости от того, что вы делаете с общими данными, вам может сойти с рук просто возврат json из вашего webapi! - person OnResolve; 10.01.2013

Вы не можете создавать ссылки между объектами разных моделей EF. Причина в том, что EF попытается разрешить ассоциации при соединении SQL, и поэтому ему нужна информация о сопоставлении всех задействованных классов.

Помечтав, я мог бы представить, что должна быть возможность объединять модели и определять ассоциации между их классами, но да....

Таким образом, лучшее, что вы можете сделать при работе с edmx, — это использовать обе модели по отдельности в своем проекте и использовать соединения в памяти (связывание с объектами), где это применимо. Боюсь, не самое эффективное решение.

Если бы вы могли переключиться на сначала код, вы могли бы иметь общие классы в отдельной библиотеке классов, дополнить их готовыми EntityTypeConfiguration классами и использовать их в своих проектах. Тогда остается только сослаться на общую библиотеку классов и добавить экземпляры конфигураций типов в класс DbContext локального проекта. Вы даже можете сопоставить ассоциации с общими классами, если внешние ключи будут частью локальной модели. (Конечно, вы не сможете добавлять поля внешнего ключа в общие классы).

person Gert Arnold    schedule 10.01.2013