Какой ORM для .NET я должен использовать?

См. , Уничтожают Все Активные соединения К Базе данных .

причина, что подход, что Adam предложил , не будет работать, состоит в том, что в течение времени, когда Вы - цикличное выполнение по активным соединениям, новый может быть установлен, и Вы будете скучать по тем. Статья я связал с использованием следующий подход, который не имеет этого недостатка:

-- set your current connection to use master otherwise you might get an error

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER

15
задан eKek0 4 May 2010 в 10:41
поделиться

8 ответов

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

NHibernate недостатки

Похоже, я сторонник NHibernate. Возможно, да. Но у NHibernate есть недостаток: у него крутая кривая обучения, и привыкание ко многим возможностям и выбор правильного или «лучшего» метода для вашей ситуации может быть сложной задачей даже для опытных разработчиков. Но это приз за ORM корпоративного уровня, способный практически на все.

NHibernate с FluentNHibernate скалы

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

Это упрощает работу с NHibernate: просто напишите свои сущности как POCO и загрузите их полностью автоматически, чтобы создать свою базу данных, ассоциации и т. Д. (Или не создавайте схему, если она уже существует). Настройте свою базу данных, используя синтаксис 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

Также есть положительный момент: существует множество инструментов автоматической генерации (включая открытые source 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 сияет, потому что это не так.

22
ответ дан 1 December 2019 в 01:23
поделиться

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

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

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

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

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

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

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

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

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

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

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

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

Вещи, которые мне не хватает в дозвуковом режиме:

  • Поддержка UnitOfWork (вы могли бы решить это с помощью поддержки транзакций.)

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

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

4
ответ дан 1 December 2019 в 01:23
поделиться

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

3
ответ дан 1 December 2019 в 01:23
поделиться

Я предлагаю проверить NHibernate.

https://www.hibernate.org/343.html

3
ответ дан 1 December 2019 в 01:23
поделиться

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

2
ответ дан 1 December 2019 в 01:23
поделиться

В качестве продолжения некоторых ответов здесь есть NHibernate Linq, возглавляемый невероятно плодовитым Ореном Эйни , AKA Ayende Rahien

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

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

1
ответ дан 1 December 2019 в 01:23
поделиться

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

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

1
ответ дан 1 December 2019 в 01:23
поделиться

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

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

0
ответ дан 1 December 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: