Ответ 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, добавлена часть отказа от ответственности