Какой ORM для .net следует использовать?

Я относительно новичок в .NET и почти год использую Linq2Sql, но мне не хватает некоторых функций, которые я ищу сейчас.

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

  • Он должен быть очень продуктивным, я не хочу иметь дело с уровнем доступа, чтобы сохранять или извлекать объекты из или в базу данных, но он должен позволять мне легко настраивать любой объект, прежде чем на самом деле передать его в базу данных; также это должно позволить мне легко работать с измененной схемой базы данных.
  • Это должно позволить мне расширять объекты, сопоставленные с базой данных, например, добавлять к ним виртуальные атрибуты (виртуальные столбцы в таблицу).
  • Он должен быть (по крайней мере, почти) агностиком базы данных, он должен позволять мне работать с различными базами данных прозрачным способом.
  • Он должен иметь не так много конфигурации или должен быть основан на соглашениях, чтобы заставить его работать.
  • Это должно позволить мне работать с Linq

Итак, знаете ли вы какую-нибудь ORM, которую я мог бы использовать? Благодарим вас за помощь.

РЕДАКТИРОВАТЬ Я знаю, что вариант - использовать NHibernate. Это является стандартом facto для приложений уровня предприятия, но также кажется, что это не очень продуктивно, потому что его глубокая кривая обучения. В другом случае, я прочитал в другом месте здесь, в SO, что он не хорошо интегрируется с Linq. Все это верно?

Ответы

Ответ 1

Возможно, лучше всего использовать NHibernate. Это, возможно, лучший "отраслевой стандарт", когда речь идет о коммерческих и ORM с открытым исходным кодом. Прошло довольно долгое время, чтобы стать действительно стабильным, используется во многих корпоративных компаниях, основано на еще более известном Hibernate (java), но полностью переписано, чтобы наилучшим образом использовать возможности .NET.

Недостатки NHibernate

Это звучит так, будто я сторонник NHibernate. Возможно, я. Но у NHibernate есть недостаток: он имеет крутую кривую обучения и привыкает ко многим возможностям, а выбор правильной или "лучшей" практики для вашей ситуации может быть сложной, даже для опытных разработчиков. Но это приз платить за ОРМ корпоративного уровня, который способен практически на все.

NHibernate с FluentNHibernate rock

Многие из этих недостатков и проблем с настройкой испаряются в минуту, когда вы начинаете использовать Fluent Nhibernate, лично я вряд ли обойдусь без него, поскольку он удаляет все утомительность NHibernate сразу (почти).

Это делает работу с NHibernate легкой: просто напишите свои объекты как POCOs и загрузите их полностью автоматически, чтобы создать свою базу данных, ассоциации и т.д. (или не создавайте схему, если она там уже есть). Настройте свою базу данных с помощью синтаксиса Fluent. Очень простая настройка может выглядеть так же просто:

// part of a default abstract setup class I use
public ISessionFactory CreateSessionFactory()
{
    return Fluently.Configure()
        .Database(
            MsSqlConfiguration.MsSql2008
                .ConnectionString(c =>
                    c.Server(this.ServerName)
                    .Database(this.DatabaseName)
                    .Username(this.Username)
                    .Password(this.Password)
                    )
        )
        .Mappings(m =>
            m.AutoMappings.Add(AutoMap.AssemblyOf<User>()   // loads all POCOse
                .Where(t => t.Namespace == this.Namespace))
                // here go the associations and constraints,
                // (or you can annotate them, or add them later)
            )
        .ExposeConfiguration(CreateOrUpdateSchema)
        .BuildSessionFactory();
}


// example of an entity
// It _can_ be as simple as this, which generates the schema, the mappings ets
// but you still have the flexibility to expand and to map using more complex
// scenarios. It is not limited to just tables, you can map views, stored procedures
// create triggers, associations, unique keys, constraints etc.
// The Fluent docs help you step by step
public class User
{
    public virtual int Id { get; private set; }   // autogens PK
    public virtual string Name { get; set; }      // augogens Name col
    public virtual byte[] Picture { get; set; }   // autogens Picture BLOB col
    public virtual List<UserSettings> Settings { get; set; }  // autogens to many-to-one
}

public class UserSettings
{
    public virtual int Id { get; private set: }   // PK again
    public virtual int UserId { get; set; }       // autogens FK
    public virtual User { get; set; }             // autogens OO-mapping to User table
}

который принимает все объекты POCO и автоматически сопоставляет их, создает конфигурацию для ORM и строит схему в базе данных, если у пользователя есть достаточные права. Одной из очень мощных возможностей Fluent (и NH для меньшей степени) является обновление схемы базы данных при внесении любых изменений.

Другие вспомогательные средства для NHibernate

Также в верхней части: существуют многие средства генерации автоматов (в том числе открытый источник MyGeneration), который может принимать ваши схемы БД от простого ODBC или другого соединения и превратить их в правильные классы сущностей, ассоциации и файлы конфигурации HBM. Многие из этих инструментов являются (частично) графическими средствами проектирования.

Используйте S # arp для обеспечения наилучших практик MVC + NH + NUnit

Обязательно прочтите лучшие практики NHibernate. Это приносит дженерики и DAO на следующий уровень. Вы также можете перейти к преследованию и глубоко погрузиться с помощью S # arp (скачать), которая является основой, которая накладывает все эти лучшие практики и добавляет NUnit в смесь.

Прежде чем я начну использовать новую технологию, я обычно хочу, чтобы она была хорошо освещена. NHibernate и Hibernate здесь не хватает. Многие книги объясняют (N) Hibernate от стартера до профессиональных, белые документы изобилуют, а документация к инструментам между тем весьма отличная.

О LINQ и NH

LINQ и NHibernate всегда хорошо сочетаются с любыми типами ICollection<>, которые используются в сопоставлениях с множеством X и другими ассоциациями, но требуют, чтобы данные сначала извлекались, что требует хорошего дизайна (кеш помогает здесь), иначе это будет плохо. Это считалось больным пунктом NH с тех пор, как появился LINQ.

К счастью, теперь в городе появился новый ребенок: NHibernate-LINQ, который передает запросы LINQ в ICriteria запросы перед отправкой. Запросы ICriteria хорошо кэшированы, и эта комбинация с LINQ очень мощная и очень эффективная. NH-LINQ теперь является частью стандартного распределения.

Отказ

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

Очень хорошо, что другие ORM лучше соответствуют вашим потребностям, особенно если вы никогда не планируете использовать его в сложных многозадачных, многодисковых или труднодоступных для хранения данных. Для меня NH сияет, потому что это никоим образом не ограничивает меня и не поддерживает полную технику roundtrip, но ваш выбор может оказаться другим, если функции более легкого ORM, которые обсуждаются здесь, будут тяжелее для вас.

Обновление: добавленный образец кода
Обновление: расширенный образец кода, исправленные опечатки и формулировки
Update:небольшие главы, добавлена ​​часть LINQ, добавлена ​​часть отказа от ответственности

Ответ 2

Почему бы не посмотреть subsonic? Мне нравится это по сравнению с другими, потому что он прозрачно прозрачен для схемы базы данных (использует ActiveRecord) и выполняет все ваши требования.

Он должен быть очень продуктивным.

Я думаю, что это работа каждого ORM? С дозвуковым вы можете использовать контроллер (для привязки данных) или просто выполнить метод Save для любого объекта ORM.

Это должно позволить мне расширить объекты

Расширение сгенерированных классов легко, все они определены как частичные. И вы даже можете редактировать шаблоны. (Они являются шаблонами T4, которые вы включаете в свой проект, поэтому у вас есть полный контроль над тем, как и что генерируется).

Это должно быть (по крайней мере, самое большое) агностик базы данных

Я думаю, что это просто для любого ORM. Subsonic поддерживает множество баз данных, из которых хорошо известны: Oracle, mySql, MsSql, SqlLite, SqlCE. Вы можете посмотреть список поддержки базы данных здесь.

У него должно быть не так много конфигурации или должны основываться на конвенции

Да, это абсолютно условно над конфигурацией или самоуверенным, как они ее называют. Для краткого изложения соглашений смотрите здесь.

Это должно позволить мне работать с Linq

Абсолютно, поскольку поддерживается версия Linq версии 3.0.

Для сравнения между nhibernate, LinqToSql и дозвуковым чтением this Это действительно справедливое и современное сравнение и в явном виде описывает различия в видения различных ORM.

Вещи, которые я скучаю по дозвуковой:

  • Поддержка UnitOfWork (вы можете решить это, используя поддержку для сделки.)

  • Поддержка IdentityMap (ваши объекты будут кэшироваться в некоторых scope (appdomain, угроза, веб-запрос контекст, время жизни страницы,...) Хотя вы хорошо утверждаете, что это должно быть частью ORM или некоторого слоя кеширования.

Я слышал, что спящий режим поддерживается одновременно.

Ответ 4

Учитывая ваши требования, я предлагаю проверить Mindscape LightSpeed ​​. Он поддерживает около восьми или девяти различных баз данных и управляется конвенцией (с настройками конфигурации), поэтому его очень легко настроить. У этого есть поставщик LINQ. Это позволяет вам расширять классы своими собственными свойствами и методами: в частности, это позволяет отделить постоянную модель (поля) от API (свойства и методы), не нарушая соглашение о настройке.

Ответ 5

Я использовал Entity Framework для нескольких проектов и очень понравился. Там, по общему признанию, были некоторые изломы в первой версии, в частности, как это касалось внешних ключей и хранимых процедур, но версия 2, которая находится в бета-версии и часть VS 2010, выглядит очень многообещающей.

Ответ 6

Как и последующие ответы на некоторые из ответов здесь, есть NHibernate Linq, возглавляемый невероятно плодовитым Орен Эини, AKA Айенде Рахиен

http://ayende.com/Blog/archive/2009/07/26/nhibernate-linq-1.0-released.aspx

Не использовал его, но выглядит очень впечатляюще. Кажется, на каком-то уровне это может быть даже замена LINQ для SQL.

Ответ 7

Человек. Я пошел с структурой сущностей. Он поддерживает Linq. Сущность framework 4.0 имеет значительные улучшения производительности более 3.5. В нем есть все, что вам нужно. EF - это больше, чем ORM, это структура. Я думаю, что nhibernate - это шутка по сравнению с инфраструктурой сущности M $. Nhibernate действительно сбросил мяч за то, что он не включил intellisense и упростил настройку.

Многие корпоративные организации также используют инфраструктуру сущности. Структура Entity может поддерживать любую базу данных, которая может запускаться в Windows, потому что у нее есть функция, позволяющая любому поставщику создавать для нее поставщика. Сделайте себе одолжение и пойдите с EF.

Ответ 8

Вы также можете посмотреть LLBLGen Хотя у него нет быстрого имени, у него есть все функции, о которых вы говорили:

Это драйверы для большинства версий баз данных, Oracle и SQL и других Он поддерживает Linq, поскольку вы можете использовать Linq для запроса объектов, сгенерированных LLBLgen Он позволяет расширять сгенерированные объекты, все они являются частичными классами

Ответ 9

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

Мы использовали Dapper для доступа к базе данных. Он очень легкий. Это очень быстро. Я все еще могу написать SQL (что является моим предпочтением). Он автоматически отображает возвращенные данные в объекты, даже динамический объект. Вы можете добавлять расширения, которые будут вставлять, обновлять и т.д. Без необходимости в SQL. Таким образом, вы можете создать его для более точного эмуляции полного ORM.

Как только вы начнете использовать его, вы будете шокированы тем, как вы жили без него. Он должен поставляться с платформой .NET.

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