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

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

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

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

Linq To SQL

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

Subsonic (Active Record)

  • База данных должна быть создана в первую очередь
  • Работает с рядом технологий баз данных
  • Классы генерируются автоматически из существующей схемы базы данных с использованием шаблонов T4.
  • Connection to database is totally transparent once classes are generated
    • Calling class constructors automagicaly create records in database
    • Изменение значений свойств автоматически обновляет базу данных.

Subsonic (простой репозиторий)

  • Структура класса должна быть на первом месте
  • Работает с рядом технологий баз данных
  • Класс репозитория создан и подключен к базе данных
  • Database schema is created and updated automaticaly when classes are added to the repository
    • repo.Add<MyClass>(instance);
    • Репозиторий использует отражение для создания / обновления схемы базы данных
    • Создайте таблицу для каждого раза и столбец для каждого свойства

NHibernate

  • Either database or class structure can be created first
  • Работает с рядом технологий баз данных
  • Классы внутри окончательной сборки приписываются настройкам сопоставления NHibernate, которые сопоставляют классы и свойства таблицам и столбцам.
  • There are two methods to add mapping configuration
    • XML files embeded in the binary, <classname>.hbm.xml
    • Атрибуты добавлены в код
  • Поддерживает расширенную конфигурацию сопоставления, включая один к одному, один к одному, многие к одному, многие ко многим, наследование и т. Д. И т. Д.

person Eric Anastas    schedule 15.09.2010    source источник
comment
А как насчет ADO.NET Entity Framework?   -  person Jim Brissom    schedule 16.09.2010
comment
Вы забыли Entity Framework. С EF вы можете выполнять разработку как для БД, так и для первоклассных разработчиков. Вы работаете с базой данных через EntitySet. У вас также есть возможность работать с несколькими базами данных с помощью Entity Framework.   -  person Justin Niessner    schedule 16.09.2010
comment
Я просто не успел изучить EF. Из того, что я читал, версия EF 3.5 на самом деле не была готова. Похоже, в версии 4.0 есть улучшения, но я только что установил VS 2010 в конце прошлой недели. Я определенно хотел бы услышать какие-либо ответы, сравнивающие рабочий процесс с EF по сравнению с другими перечисленными ORMS.   -  person Eric Anastas    schedule 16.09.2010
comment
Существуют сторонние инструменты, которые сначала добавляют модель и улучшают db-first, а также позволяют вносить инкрементные изменения в базу данных, модель или и то, и другое для некоторых из этих ORM. Одним из таких инструментов является моя надстройка для VS, которая добавляет инкрементные изменения модели DB- ›и модели-› DB как для L2S, так и для EFv4 - вы можете загрузить его с huagati.com/dbmltools, если вы хотите протестировать его ...   -  person KristoferA    schedule 16.09.2010


Ответы (3)


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

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

  • поддерживает сначала разработку кода, сначала модель, а сначала разработку базы данных. Разница между кодом сначала и моделью сначала заключается в том, что сначала в коде вы сначала пишете классы сущностей, а в модели сначала вы разрабатываете модель данных, и на ее основе создаются сущности.
  • основана на модели метаданных (EDMX) (хотя, возможно, она сначала отсутствует в коде), которая также определяет сопоставления; EDMX - это XML-модель, содержащая структуру базы данных, структуры сущностей и сопоставления между ними, и поддерживается конструктором, встроенным в Visual Studio. В коде сначала сопоставления определяются в коде, а не в EDMX.
  • поддерживает несколько технологий баз данных (я использовал MySql и Oracle).
  • based on T4 code generation (in v4), which besides allowing for interesting extensibility scenarios, can generate:
    • entities derived from a base class specific to Entity Framework (EntityObject)
    • Сущности POCO, которые вообще не зависят от Entity Framework
    • самонастраивающиеся сущности.
  • хорошо работает с сервисами RIA (Silverlight).
  • Я думаю, поддерживает почти все типы отношений и наследование с несколькими стратегиями (хотя с некоторыми из них могут быть проблемы).
  • очень хорошая поддержка Linq (Linq to Entities).

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

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

person Community    schedule 15.09.2010
comment
Похоже, NH и EF теперь довольно похожи? - person Eric Anastas; 16.09.2010
comment
Не думаю, что я лучший, кто это комментирует, но да, я думаю, что да. NH может лучше справляться с некоторыми вещами, такими как некоторые сценарии наследования сущностей, и имеет больше расширений / плагинов и т. Д., Потому что это открытый исходный код. Однако не знаю о других аспектах сравнения. - person Alex Paven; 16.09.2010
comment
Ваши коллеги оценили LLBLGen Pro как не очень? Не могли бы вы подробнее рассказать об этом? - person Frans Bouma; 01.12.2010
comment
Что ж, теперь я чувствую себя немного неуютно :) Это просто общее ощущение, которое я получил от обсуждений не по теме - и на самом деле только с одним коллегой. Поскольку я не знаком с LLBLGen, я не вдавался в подробности в этих обсуждениях, но я постараюсь сделать это, когда у меня будет возможность. Комментарий в ответе очень субъективен и неосведомлен, поэтому я постараюсь отредактировать его, чтобы он был более конкретным, если я получу больше информации, но по этой причине я сделал его CW - чтобы более знающие люди могли добавить к нему; Пожалуйста, не стесняйтесь перечислять функции в сообщении и даже удалять эту строку, если считаете, что это несправедливо. - person Alex Paven; 02.12.2010
comment
У меня был положительный опыт работы с LLBLGen с использованием подхода «сначала база данных» (сначала не пробовал код). @FransBouma - автор LLBLGen, и я рекомендую его сообщения в блоге. - person Spongeboy; 11.08.2016

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

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

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

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

person Michael Maddox    schedule 16.09.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

person Nilesh Gule    schedule 17.09.2010