SubSonic 3, модель данных сущности (Entity Framework) или LINQ to SQL для разработки ASP.NET MVC?

Я использовал все из них (некоторые чаще, чем другие), но до сих пор не могу решить, какой из них лучше всего использовать (с .NET 3.5). Каковы плюсы и минусы каждого из них при разработке?

SubSonic 3
Недостаточно образцов / документации (я знаю, что это вики, и люди могут обновлять ее, но может быть сложно отследить вещи - например, где находятся образцы приложений (WebForms, MVC ( текущая версия, а не до 3) WinForms)). Текстовые шаблоны не работали должным образом, когда я впервые их попробовал. Например, он не очищает имена таблиц, как это сделал SubSonic 2 (например, удаление / замена пробелов). Кроме того, вы не можете сказать, какие таблицы включать, только те, которые вы можете исключить (в ActiveRecord.tt). Context.tt и Structs.tt генерируют код для всех таблиц (вам, вероятно, не нужны таблицы aspnet_ и, возможно, некоторые другие (сеансовые таблицы)).

Сказав это (надеюсь, я не слишком резок), это неплохой ORM для использования, если не считать мелких проблем.

Модель данных сущности (Entity Framework)
Visual Designer для настройки моделей. Синхронизация с базой данных может показаться немного «многословной» и сложной для понимания. Однако есть довольно приличная документация. Тем не менее, не так уж и подробно.

LINQ to SQL Также есть конструктор для создания моделей. Простой в использовании. Меньше возможностей, чем у двух других. Мне также пришлось применить исправление для неясной ошибки (не обновлялось, если в модели были внешние ключи, отличные от типа int)

NHibernate
Вы смотрели на это в прошлом, но не так просто настроить по сравнению с приведенным выше. Любые образцы приложений ASP.NET MVC, использующие это?

В идеале мне нужен фреймворк, который:

a) может генерировать модели из базы данных
b) поддерживать синтаксис LINQ
c) извлекать только те данные, которые необходимы (например, для разбивки на страницы)
d) разрешать аннотации данных
e) может генерировать sql для обновления или создания новых таблиц в существующей базе данных


person SamWM    schedule 06.09.2010    source источник
comment
Взгляните на ormbattle.net   -  person queen3    schedule 07.09.2010
comment
дубликат: [nhibernate, framework entity, активные записи или linq2sql] (stackoverflow.com/questions/1377236/)   -  person Michael Maddox    schedule 07.09.2010
comment
Вам необходимо указать, является ли .NET 4.0 вариантом или просто .NET 3.5. Непонятно, почему вы не включили NHibernate, учитывая, что он соответствует всем вашим критериям, имеет гораздо большее сообщество и набор функций, чем другие перечисленные вами. Под Entity Data Model я предполагаю, что вы имеете в виду Entity Framework. ORMBattle.net был создан одним поставщиком ORM, по всей видимости, как маркетинговый инструмент.   -  person Michael Maddox    schedule 07.09.2010
comment
Может быть дубликат, но есть ли какие-то другие фреймворки, которые вышли с тех пор, или другие улучшенные (этому вопросу больше года)   -  person SamWM    schedule 09.09.2010
comment
Мой ответ на этот вопрос актуален. Вы увидите, что мой ответ последний раз редактировался 5 июня 2010 г. и включает информацию о .NET 4.0.   -  person Michael Maddox    schedule 13.09.2010


Ответы (1)


MVC - это уровень представления, ORM - уровень данных

Я не думаю, что ORM имеет что-нибудь так много общего с приложением MVC. По крайней мере, если вы правильно разместите свое приложение по уровням. Модель в приложении MVC - это скорее модель представления уровня представления. Модель представления, через которую взаимодействуют контроллер и представление. Не обязательно модель данных. Шаблон проекта MVC немного сбивает с толку, поскольку разработчики думают, что модель MVC = модель данных. В любом бизнес-приложении, которое не является полностью тривиальным (например, в простом приложении с одной сборкой), этого нет. И лучше, чтобы это не было. Особенно если принять во внимание разделение проблем. Мы не должны полагаться на определенные классы ORM на каком-либо уровне, кроме уровня данных.

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

Предположение

Но предлагаю заняться другим делом. Используйте отдельный слой с объектами POCO, которые будут использоваться на всех слоях и будут иметь аннотации к данным. Это сделает ваш уровень представления независимым от уровня данных, и ваши POCO также могут быть оптимизированы для представления (например, наличие класса с именем UserRegistration, например, с двумя свойствами пароля - также с повторяющимся значением). Ваш репозиторий на вашем уровне данных будет отвечать за преобразование POCO, поэтому все слои будут обмениваться данными с использованием только POCO вместо использования объектов данных.

ORM и генерация классов

С Entity Framework вы получаете очень управляемую среду для создания ваших классов из схемы хранилища данных. К сожалению, с другими все иначе. Генерация не является универсальной, но ею также можно управлять и манипулировать ею вручную (если вы хотите создавать структуры TPH / TPT).

Аналогично LINQ to SQL. Я не использовал никакой другой ORM, но полагаю, что у LinqConnect может быть собственный редактор, похожий на редактор EF Visual Studio, потому что я работал с коннектором MySql от той же компании, и я использовал их конструктор для сущностей, потому что он был лучше чем тот, который поставляется с Visual Studio 2008.

Но у вас есть инструменты, которые обеспечивают генерацию кода (и вы также можете получить в Интернете шаблоны для различных ORM):

  • в Visual Studio встроен T4, который может сгенерировать для вас код; Вы также можете найти шаблоны для ORM, написанные на T4, которые затем легко настроить. Или напишите свой собственный в соответствии с вашими потребностями (в прошлом я писал генератор перечислений из таблиц поиска БД)
  • MyGeneration имеет открытый исходный код, и вы можете найти для него множество шаблонов.
  • CodeSmith не является бесплатным, но это проверенный продукт, который я использовал в прошлом с шаблоном .netTiers (ранее у нас был LINQ), который сэкономил много времени и отлично работал
person Robert Koritnik    schedule 07.09.2010
comment
Разве это не уровни MVC 3 (модель = уровень данных, представление = представление, контроллер = бизнес-логика)? Значит, ORM может быть его частью? - person SamWM; 09.09.2010
comment
@Sam: Не совсем так, но в простых проектах Модель (в MVC) = DTO (классы ORM). Я скорее думаю о модели в MVC как о ViewModel, потому что, если мы посмотрим на MVC framework. Контроллер выполняет бизнес-логику, View действительно представляет данные пользователю и взаимодействует с ним, но модель обычно используется для связи между эти двое. С другой стороны, модель данных - это внешняя часть, к которой могут обращаться контроллеры, чтобы получить данные для заполнения моделей MVC. Как сказано. Это могут быть одни и те же классы, но MVC не подразумевает, что они должны быть такими. И я думаю, что этого не должно быть. - person Robert Koritnik; 09.09.2010
comment
Я использую MyGeneration, и некоторые разработанные мной проекты все еще используют dOOdads (также загружено более 30 шаблонов в библиотеку шаблонов). - person SamWM; 10.09.2010
comment
Однако люди могут интерпретировать ORM как модель, поскольку Entity Framework используется в учебнике по музыкальному хранилищу MVC, а сгенерированные классы хранятся в папке Models. NHibernate (и, возможно, Entity Framework тоже) можно считать излишним для простых проектов, но Entity Framework намного быстрее и проще в настройке. - person SamWM; 10.09.2010
comment
@Sam: шаблон проекта MVC предназначен для разработки как единого сборочного приложения. В большинстве случаев это не так, и это действительно сбивает разработчиков с толку, поэтому они думают, что M (как модель) на самом деле означает модель данных. У меня обычно есть собственные POCO для M, и все слои обмениваются данными с их помощью. Но они не находятся в папке MVC / Model, а являются частью отдельного проекта, поэтому все сборки ссылаются на эти классы. Репозитории используют модель данных EF и создают объекты POCO и передают их на уровень сервиса. - person Robert Koritnik; 10.09.2010
comment
Не видел примеров того, как это делать (хотя это сделало бы руководство длиннее). У меня нет большого опыта работы с MVC (хотя я использовал ASP.NET какое-то время), просто на основе руководств на сайте asp.net mvc. - person SamWM; 10.09.2010