Где разместить модель данных Entity Framework в приложении MVC? Конкретный пример

Сначала я хочу сослаться на этот пост:

Где разместить модель данных Entity Framework в приложении MVC?< /а>

В моем edmx будет 7-10 таблиц. Не более.

Проблема в том, что мне нужно построить свою модель, с которой я работаю, из [допустим] 4 таблиц. Поэтому я спрашиваю себя: являются ли эти таблицы реальными представлениями моделей, и было бы правильно поместить файл edmx в папку «Модели» и как мне назвать этот КОНТЕЙНЕР моделей?

Или достаточно 10 таблиц для создания нового проекта? Как назвать проект? .Доступ к данным? Как назвать файл edmx в нем?

У меня нет такого большого опыта работы с MVC и EF, и я пытаюсь найти лучшую практику.

Обновление: в в этом сообщении говорится мне не помещать его в папку «Модели»: «Модель должна быть максимально отделена от технологии внутреннего хранилища данных».


person timmkrause    schedule 16.03.2012    source источник


Ответы (2)


Лично мои проекты MVC (независимо от размера) состоят как минимум из следующего:

  • Данные
  • Логика
  • Сайт

Эта структура работает довольно хорошо, поскольку она отделяет бизнес-логику от хранения и отображения.

Вы определенно не хотите помещать EDMX в папку моделей, поскольку она зарезервирована для моделей просмотра. В соответствии с передовой практикой модели представления должны быть полностью отключены от ваших объектов хранения.

Что касается именования EDMX, я обычно называю его после краткого названия проекта, более важно правильно указать пространство имен для EDMX, чтобы ваши модели располагались в правильном месте пространства имен.

person Not loved    schedule 16.03.2012
comment
Что означает правильное расположение пространства имен? Если я хочу полностью отключить EDMX, я предполагаю, что это означает отдельный проект. Поэтому я называю этот проект AppName.DataAccess. Таким образом, объекты EDMX будут иметь что-то вроде AppName.DataAccess.Entities. - person timmkrause; 16.03.2012
comment
Да, вот что я имею в виду, вам нужно убедиться, что пространство имен, которое вы выбираете для карты EDMX, находится где-то в AppName.DataAccess, иначе это не будет иметь особого смысла. - person Not loved; 16.03.2012
comment
Можете ли вы объяснить данные, логику и сайт немного глубже? Я исхожу из проектов трехуровневых веб-форм (DataAccess, BusinessObjects, WebApp). Является ли сайт вашим фактическим проектом MVC? И все это были отдельные проекты? - person timmkrause; 16.03.2012
comment
Да, сайт — это ваш проект MVC, который состоит из представлений моделей и контроллеров, а также логики отображения и пользовательского интерфейса. Логика — это место, где я реализую бизнес-правила относительно того, как работает приложение, лично я довольно активно использую внедрение зависимостей, поэтому логика — это место, где я размещаю такие вещи, как моя логика входа/криптографии и бизнес-правила. Для данных я обычно использую готовый общий шаблон репозитория, который потребляют мои логические компоненты. На самом деле у меня есть пример проекта: dl.dropbox.com/u/ 37129059/StaticVoid.Repository.Demo.zip, который использует мой шаблон репозитория и структуру проекта, о которой я здесь говорю. - person Not loved; 17.03.2012
comment
@tkrause также взгляните на мою запись в блоге о моей структуре репозитория, которая предназначена для инкапсуляции и отделения от EF blog.staticvoid.co.nz/2011/10/ - person Not loved; 17.03.2012

Мой ответ основан на Silverlight, и я понимаю, что он немного вырван из контекста, потому что вы спрашиваете с точки зрения MVC. Но, пожалуйста, позвольте мне проиллюстрировать, куда я положил свой EDMX.

Первое проектное решение

-Виджеты. Это несколько проектов пользовательского интерфейса с несколькими страницами XAML.

-Логика пользовательского интерфейса требует тщательной организации каждого виджета и страниц XAML в одном основном пользовательском интерфейсе.

-Просмотр-Модели. Они почти эквивалентны контроллерам в MVC. Я использую XAML для прямой привязки к моделям представления. Пример QuotationItemModel.vb и xyz.vb и тому подобное. Несколько страниц XAML могут совместно использовать одну виртуальную машину.

-XAML-страницы предполагают использование привязок команд в соответствии с реализацией View-Models. Пример нажатия кнопки направляется на виртуальную машину. Я не добился этого, потому что логика координации пользовательского интерфейса (от другого архитектора пользовательского интерфейса) мешала моему подключению к команде делегирования (CanExecute, Execute Func (Of Object, Boolean) Action (Of Object), вызывая переполнение стека в виджетах первого уровня. событие щелчка.)

-Модель. Здесь есть только одна функция. Ее задание подключает делегата к событию завершения асинхронного вызова веб-службы, а затем запускает веб-службу. Реализация Deletegate фактически находится в View-Model, то есть в QuotationItemModel.vb, а не внутри модели. В Model.vb действительно есть только одна функция.

-Другой логики в Модели нет. то есть Model.vb определяет конечные точки, привязки http, материалы WCF

- В этом решении нет EDMX. Модель также ничего не знает о базе данных.

Второй проект (но внутри третьего решения)

  • Реализация WCF. Легкий вес. Опять 1 функция. Только операционные контракты.

  • Код позади только передает бизнес-объекты в третий проект.

  • Строка подключения для EDMX настраивается здесь и передается третьему проекту.

  • Никакой другой логики.

  • О EDMX вообще ничего не известно.

Решение третьего проекта

-Начинается с простой фабрики для делегирования логики и вызова классов

-Начинается с простой заводской логики, становится очень тяжелым бэкендом. Использует шаблоны проектирования для облегчения проблем с обслуживанием. Отсюда шаблоны могут пересекаться между командами, стратегией или абстрактными типами и т. д. и т. д.

-Дизайн EDMX полностью проявляется в этом слое.

-Бизнес-объекты логически взаимодействуют с EDMX

-Я либо делаю LINQ to Entities, либо параметризованные запросы здесь

- Этот уровень состоит из бизнес-логики, такой как идентификатор андеррайтинга, который должен существовать до того, как транзакция требования может быть выдана. Или порядковый номер котировки, основанный на дате сервера. и т. д. и т. д.

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

-Результат передается обратно в виде XML

Третий проект вполне может быть отдельным решением с еще одним легким веб-сервисом между ними, что обеспечит готовность к трехуровневой архитектуре. Затем я создам свою собственную строку подключения к EDMX на этом чистом уровне. Но моя теперь больше похожа на архитектуру второго уровня «2.5». Я застенчиво выставляю строку подключения в веб-конфигурации среднего уровня. Архитектура означает наличие другой аппаратной платформы. Уровень — это разделение для предметно-ориентированного дизайна в проблемной области, т. е. пользовательского интерфейса, коммуникации и бизнес-областей. С технической точки зрения база данных SQL Server (помимо EDMX) вполне может находиться в другой архитектуре, например в Windows Azure.

Здесь я вижу плюсы и минусы. Пожалуйста, вносите любую критику осторожно, я действительно новичок в многослойности.

Минусы Без раскрытия контрактов данных мой пользовательский интерфейс слеп при общении на языке бизнес-объектов и контрактов. Раньше этого легко было добиться, имея EDMX на уровне WCF. Теперь я использовал Xelement для представления общего бизнес-объекта. Но мне все еще нужно найти способ раскрыть контракт данных, не раскрывая внутренности базы данных. В настоящее время я «инстинктивно» знаю и кодирую поля базы данных в своих Xelements.

Потенциально это похоже на тихую привязку к серверной части EDMX. Молчание иногда плохо, потому что, если я получаю столбец без данных, есть много предполагаемых причин. Ничего, что нельзя было бы решить с помощью хороших сообщений об ошибках из возвращенного результата XML. Используя свое воображение.

Слабый механизм управления версиями. Возможно, новые клиенты взаимодействуют с отдельным операционным контрактом для автоматического перенаправления на Backend-Ver 2.0, в то время как существующие клиенты используют Backend-Ver 1.0. Это потенциально означает, что теперь у вас должно быть 2 EDMX для каждой старой и новой базы данных соответственно.

Плюсы Экстремальная развязка. Я могу удалить/перестроить EDMX и пользовательский интерфейс, а WCF все еще компилируется. Только мое третье решение получит ошибку компиляции в этом экстремальном тестировании.

Из пользовательского интерфейса Silverlight запуск и связь с отчетом Microsoft Report Viewer использует точно такие же классы, которые вызываются из пользовательского интерфейса. Нет никаких «дополнительных функций веб-сервиса для отчета». Независимо от того, какая логика EDMX + запрашивается пользовательским интерфейсом, она точно такая же для отчета, если только я не выбрал ее. PS: Silverlight передает критерии фильтрации в отчет через строку запроса.

Отчет снова не знает о EDMX. Например, если я удаляю EDMX из серверной части, а затем обновляю подключение к данным из проекта отчета, проект отчета по-прежнему компилируется без проблем.

Готовность к миграции на множественную архитектуру без слез. Сезонная балансировка нагрузки, увеличение клиентской базы и т. д. могут вызвать эти инвестиции в архитектуру.

Повторное использование бизнес-логики. Например, если босс устанет от Silverlight, мне нужно будет просто перекодировать бизнес-объекты пользовательского интерфейса, скажем, в JSON?? под HTML 5. В бизнес-логике нет никаких изменений, кроме новых требований. Например, чтобы расширить страхование жизни для сосуществования с существующим общим страхованием, модуль, который в настоящее время закодирован в Silverlight. Представьте страхование жизни в HTML 5 и все еще сосуществующее с одним и тем же бэкэндом. Опять же, причина в том, что оба интерфейса не знают о EDMX, мне просто нужно сосредоточиться на построении контракта данных с помощью новой технологии.

Неожиданный (я действительно новичок в многослойности!) Побочный эффект. Я потенциально могу протестировать свой бэкенд отдельно от пользовательского интерфейса. Которые, в свою очередь, манипулируют LINQ to Entity (этим EDMX). Круто для модульного тестирования.

Обновление бизнес-логики не влияет на новое развертывание в IIS (средний уровень), за исключением случаев, когда речь идет об управлении версиями.

В любом случае, вот руководство по решению многоуровневых приложений от талантливого архитектора программного обеспечения Серены Йео.

Пример многоуровневой архитектуры для .NET

http://layersample.codeplex.com/

http://layerguidance.codeplex.com/

Обратите внимание на образец, который вы загружаете, изобретательность использования нескольких пользовательских интерфейсов для разных технологий на общем бэкэнде, где EDMX живет и спит. И более того, поверх основы рабочего процесса Windows, выборочно вызываемой по мере необходимости. Вы можете видеть, куда Серена поместила EDMX, и у вас есть рабочий код. Блаженство.

person Fun Chiat Chan    schedule 16.03.2012