Сравнение ORM: Что первично - база данных или классы?

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

Теперь я не спрашиваю и не утверждаю, лучше ли один лагерь, чем другой. Я, конечно, вижу причины для каждой методологии проектирования. Что меня расстраивает, так это из всех руководств и "начинающих" документов, которые я читал в последнее время, никто не выходит и говорит в самом начале "этот инструмент предполагает, что вы начинаете с существующей базы данных / объектной модели". Для меня это очень важно, если бы вы использовали один ORM против другого.

Итак, после того, как я много читал и создал пару проектов "Hello World", я собрал серию пунктов о рабочих процессах, поддерживаемых ORM, которые я изучал. Может ли кто-нибудь, имеющий опыт работы с этими инструментами, сказать мне, если я сделал какие-либо неверные заявления или полностью пропустил какие-либо действительно важные моменты. В частности, мне бы очень хотелось узнать, верны ли мои предположения о том, должна ли схема базы данных или объектная модель быть на первом месте с каждым инструментом.

Linq To SQL

  • База данных должна существовать первой
  • Работает только с SQL Server
  • Класс DataContext используется для чтения / записи между классами и базой данных.
  • DataContext может возвращать реальные физические классы, или динамические типы могут использоваться для автоматического создания типов на основе схемы базы данных.
  • Отображение по умолчанию сопоставления имен таблиц с именами классов и имен свойств с именами столбцов
  • Сопоставление можно настроить с помощью атрибутов, встроенных в каждый класс

Subsonic (Активная запись)

  • База данных должна быть создана в первую очередь
  • Работает с рядом технологий баз данных
  • Классы генерируются автоматически из существующей схемы базы данных с использованием шаблонов T4
  • Подключение к базе данных полностью прозрачно после генерации классов
    • Вызов конструкторов классов автоматически создает записи в базе данных.
    • Изменение значений свойств автоматически обновляет базу данных.

Дозвуковой (простой репозиторий)

  • Структура класса должна быть на первом месте
  • Работает с рядом технологий баз данных
  • Класс репозитория создан и подключен к базе данных
  • Схема базы данных создается и обновляется автоматически при добавлении классов в хранилище.
    • repo.Add<MyClass>(instance);
    • Репозиторий использует отражение для создания / обновления схемы базы данных
    • Создайте таблицу для каждого времени и столбец для каждого свойства

NHibernate

  • Сначала можно создать базу данных или структуру классов.
    • Сопоставление может быть создано для соответствия новой структуры класса существующей базе данных
    • Сопоставление может использоваться для автоматической генерации схемы базы данных.
  • Работает с рядом технологий баз данных
  • Классы в окончательной сборке связываются с параметрами сопоставления NHibernate, которые сопоставляют классы и свойства таблицам и столбцам.
  • Есть два способа добавить конфигурацию отображения
    • XML-файлы, встроенные в двоичный файл, <classname>.hbm.xml
    • Атрибуты добавлены в код
  • Поддерживает расширенную конфигурацию отображения, включая один к одному, один к одному, много к одному, много ко многим, наследование и т. Д. И т. Д....

3 ответа

Продолжая комментарии, которые привели Entity Framework:

Entity Framework (в Википедии также есть хорошо структурированная информация)

  • поддерживает сначала разработку кода, сначала модели, но и разработку базы данных. Разница между первым кодом и моделью в том, что сначала в коде вы сначала пишете классы сущностей, а в модели сначала вы разрабатываете модель данных, а сущности генерируются на ее основе.
  • основанный на модели метаданных (EDMX) (хотя она, возможно, сначала отсутствует в коде), которая также определяет отображения; EDMX является моделью XML, содержащей структуру базы данных, структуры сущностей и сопоставления между ними, и поддерживается разработчиком, встроенным в Visual Studio. В первом коде отображения определяются в коде, а не в EDMX.
  • поддерживает несколько технологий баз данных (я использовал MySql и Oracle).
  • основанный на генерации кода T4 (в v4), который помимо учета интересных сценариев расширяемости может генерировать:
    • сущности, полученные из базового класса, специфичного для Entity Framework (EntityObject)
    • Объекты POCO, которые вообще не зависят от Entity Framework
    • самообследуемые лица.
  • хорошо работает со службами RIA (Silverlight).
  • Я думаю, что поддерживает почти все типы отношений и наследование с несколькими стратегиями (хотя с некоторыми из них могут быть проблемы).
  • очень хорошая поддержка для Linq (Linq to Entities).

Есть также LLBLGen, который я не использовал, но по комментариям одного из моих коллег он не так хорош.

Я использовал NHibernate раньше, хотя и кратко, и впечатление было хорошим; хотя тогда он не был таким зрелым, как сейчас, он все еще был очень хорошей библиотекой. Не уверен, если бы мне пришлось выбирать между NH и EF сейчас... Я думаю, что я бы пошел с EF, потому что это то, что я использовал в течение последнего года или около того, и развитие будет идти быстрее (только для меня), но особенность в противном случае NH может быть немного лучше.

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

Все ORM, включенные в ваш вопрос (в том числе EF 4 и LLBLGen Pro 3), могут справиться с любым из них, но могут быть разные боли. Например, выполнение кода в первую очередь для LinqToSql не совсем то, для чего он был предназначен, но я считаю, что есть проекты с открытым исходным кодом, в которых эта функция была "закреплена". Тем не менее, в принципе нет веской причины рекомендовать LinqToSql, учитывая, что Microsoft вместо этого подталкивает всех к Entity Framework.

Прямо сейчас, NHibernate, вероятно, имеет лучший общий код первый рассказ. Трудно предположить, какой ORM имеет лучшую общую историю базы данных, учитывая, что все они в значительной степени поддерживают ее, и этот конкретный вариант использования не совсем то, на чем вы должны основывать свое решение.

Выберите ORM на основе того, является ли это хорошим ORM. Хорошие ORM сначала поддерживают как базу данных, так и код.

Я также оцениваю пару инструментов ORM. Я написал несколько блогов о своем опыте. Может быть, это поможет вам

http://nileshgule.blogspot.com/2010/09/entity-framework-part-2-comparison.html

http://nileshgule.blogspot.com/2010/09/nhibernate-code-first-approach-with.html

http://nileshgule.blogspot.com/2010/08/entity-framework-hello-world.html

Другие вопросы по тегам