Как использовать одну и ту же таблицу в нескольких моделях? - PullRequest
4 голосов
/ 20 июля 2011

Я работаю с Entity Framework 4.1 в веб-приложении MVC3.Мне поручено переписать унаследованное приложение с базой данных с примерно 200+ таблицами, уже имеющими данные, и, таким образом, использовать сначала подход к базе данных с EF.

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

Когда я размещаю общую таблицу (например, Users) в двух моделях, проект выдает ошибку компиляции в виде:

Тип 'Project.Models.EntityX'уже содержит определение для EntityX_PropertyY

Ближайший найденный мной обходной путь был здесь: http://connect.microsoft.com/VisualStudio/feedback/details/366721/entity-framework-the-type-xxx-already-contains-a-definition-for-x

Опубликовано Microsoft 17.09.2008в 5:18 вечера

Эта проблема задуманна.Обходной путь - либо поместить модели в другую папку (для проектов C # и ASP.NET), либо задать пространство имен настраиваемого инструмента (для проектов C # и VB).

Это было еще в '08.Я не мог заставить ни один из вариантов работать, и мне интересно, есть ли лучший способ создать проект, чтобы я мог использовать одну и ту же таблицу в более чем одной модели?

Ответы [ 3 ]

3 голосов
/ 20 июля 2011

Наша команда прошла все эти посты для нашего проекта (~ 600 таблиц). Большим предостережением для моего ответа здесь является то, что мы еще не завершили проект, поэтому не все обучение имело место. Я могу предложить только то, что мы узнали до сих пор.

По сути, то, что вы хотите сделать, невозможно реалистичным способом (в настоящее время, о котором я знаю).

Наши требования заключались в том, чтобы иметь возможность использовать визуальный конструктор (не обязательно дизайнер Visual Studio) и не нужно взламывать кучу автоматически сгенерированных файлов (или создавать инструменты для автоматического взлома файлов), потому что это просто рецепт катастрофы во многих отношениях.

В итоге мы получили два возможных решения, отметив, что нам действительно нужно было логическое группирование таблиц:

  • Используйте конструктор в LLBLGen (примечание: не бесплатен для коммерческого использования), который может логически разделить таблицы на разные «представления» базы данных

  • Разделение таблиц на бизнес-подмножества (т. Е. Продажи, отчеты и т. Д.), При этом перекрывающиеся таблицы повторяются с использованием разных имен и, возможно, различного набора столбцов в каждом поддомене.

На нашем этапе тестирования нам очень понравился дизайнер LLBLGen; однако варианты генерации кода вызывают головокружение (определенно написанное программистом для программистов), и вывод оставляет желать лучшего (с моей первой попытки он генерировал код, который не компилировался). Если вы готовы вложить несколько долларов в свой проект и потратить некоторое время на тестирование, я все равно рекомендую вам попробовать его сами (есть бесплатная пробная версия); Как я уже сказал, дизайнер довольно хороший, и, читая в Интернете, кажется, есть много историй успеха.

Излишне говорить, что мы выбрали последнее решение. Это сработало для нас, потому что в нашей бизнес-модели, когда у нас есть «общая» таблица, во всех, кроме одной из моделей поддоменов, эта таблица доступна только для чтения, и мы не беспокоимся о распространении изменений между всеми моделями поддоменов (т. Е. нам нужно только определенное представление данных из каждого субдомена). Это может быть не то же самое для вас. Это дополнительные затраты на обслуживание, если вы начинаете вносить радикальные изменения в базовую схему, но поскольку вы работаете с устаревшей базой данных, это, вероятно, не будет иметь место. Мы решили, что компромисс стоил того, чтобы сохранить инструмент в нашей существующей среде разработки. (Примечание: мы используем слегка модифицированный текстовый шаблон POCO для генерации самих классов сущностей. Если ничего другого, эта часть была действительно хорошим решением.)

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

Во время наших чтений мы видели некоторые грохоты о поддержке "представлений" модели непосредственно в конструкторе Visual Studio. Если бы это существовало, мы бы обязательно его использовали. Как бы то ни было, я подозреваю, что такая функция находится на заднем плане. Проекты с 200 таблицами - определенно ниша по сравнению с проектами с 100 таблицами или менее, которые действительно не нуждаются в такой возможности.

1 голос
/ 02 августа 2011

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

0 голосов
/ 02 августа 2011

Просто добавьте это, если вы все еще хотите попробовать, но пытались ли вы поместить модели в разные сборки?

Например: все таблицы заказов в модели в MyProject.Data.SalesВсе управление клиентами в модели в MyProject.Data.Customers и т. Д.

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

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