Сравнение ORM: Что предшествует базе данных или классам? - PullRequest
9 голосов
/ 15 сентября 2010

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

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

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

Linq To SQL

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

Дозвуковой (Активная запись)

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

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

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

NHibernate

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

Ответы [ 3 ]

2 голосов
/ 16 сентября 2010

Продолжая комментарии, которые привели 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 может быть немного лучше.

1 голос
/ 17 сентября 2010

Я также оцениваю пару инструментов 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

1 голос
/ 16 сентября 2010

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

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

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

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

...