也许你最好使用
NHibernate。在商业和开源ORM方面,它可以说是最好的“行业标准”。它已经存在了很长时间以变得非常稳定,被许多企业公司所使用,基于更为著名的Hibernate(Java),但已经完全重写以充分利用.NET功能。
NHibernate的缺点
这听起来像我是NHibernate的支持者。也许我是。但NHibernate有一个缺点:它有一个陡峭的学习曲线,即使对于经验丰富的开发人员来说,熟悉其许多可能性并选择适合您情况的正确或“最佳”实践也可能令人生畏。但这是为了使用几乎可以做到任何事情的企业级ORM而付出的代价。
使用FluentNHibernate的NHibernate效果很棒
许多这些缺点和设置问题在您开始使用
Fluent NHibernate后就会消失,个人而言,我几乎再也离不开它了,因为它一下子消除了所有NHibernate的繁琐之处(几乎)。
它使得使用NHibernate变得轻松:只需将您的实体编写为POCO,并自动加载它们以创建您的数据库、关联等(如果已经存在模式,则不创建)。使用流畅的语法配置您的数据库。一个非常简单的设置可以看起来像这样:
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>()
.Where(t => t.Namespace == this.Namespace))
)
.ExposeConfiguration(CreateOrUpdateSchema)
.BuildSessionFactory();
}
public class User
{
public virtual int Id { get; private set; }
public virtual string Name { get; set; }
public virtual byte[] Picture { get; set; }
public virtual List<UserSettings> Settings { get; set; }
}
public class UserSettings
{
public virtual int Id { get; private set: }
public virtual int UserId { get; set; }
public virtual User { get; set; }
}
该框架可以自动映射所有POCO实体,创建ORM的配置并在数据库中构建模式,前提是用户具有足够的权限。Fluent(以及NH到某种程度上)非常强大的一个能力是,在进行任何更改时更新数据库模式。
NHibernate的其他辅助工具
另外一个优点是:许多自动生成工具存在(包括开源MyGeneration),可以从简单的ODBC或其他连接获取DB模式,并将其转换为正确的实体类、关联和HBM配置文件。其中许多工具是(部分)图形化设计辅助工具。
使用S#arp强制执行MVC + NH + NUnit最佳实践
请务必阅读NHibernate最佳实践。它将泛型和DAO带入了下一个级别。您也可以直接使用S#arp(下载),这是一个强制执行所有这些最佳实践并将NUnit添加到混合物中的框架。
在开始使用新技术之前,我通常希望它得到很好的覆盖。NHibernate和Hibernate在这方面都不逊色。许多书籍从初学者到专业人士都有解释,白皮书丰富,工具文档也相当出色。
关于LINQ和NH
LINQ和NHibernate一直以来都很好地配合使用,通过各种ICollection<>
在多对X映射和其他关联中使用,但需要先检索数据,这需要良好的设计(缓存可以帮助),否则性能会很差。自从LINQ出现以来,这一点一直被视为NH的痛点。
幸运的是,现在有一个新生力量:NHibernate-LINQ,它将LINQ查询映射到提交之前的ICriteria
查询上。ICriteria查询具有很好的缓存,并且与LINQ结合使用既强大又高效。 NH-LINQ现在已成为标准发行版的一部分。
免责声明
我已经使用NHibernate将近十年了(首先是Java,后来是.NET)。我曾试过其他商业和开源ORM,但最终总是返回NH(除非公司政策要求不同,但这很少见)。这个故事可能听起来有些偏见,但这里的空间太小,无法详细讨论NHibernate与其他技术的比较。
其他ORM可能更适合您的需求,特别是如果您从未计划在复杂的多数据库、多数据库服务器或难以映射到面向对象的遗留代码情况下使用它。对我而言,NH闪耀是因为它不会在任何方面限制我,并支持完全的往返工程,但如果您需要更轻量级ORM的功能,则您的选择可能会有所不同。
更新:添加了代码示例
更新:扩展了代码示例,修正了拼写错误和措辞
更新:增加章节,添加了LINQ部分,添加了免责声明部分