我是.NET的新手,已经使用Linq2Sql近一年了,但它缺少我现在正在寻找的一些功能.
我将开始一个新项目,我想在其中使用具有以下特征的ORM:
它必须非常高效,我不想处理访问层以保存或从数据库中检索对象,但它应该允许我在实际将其提交到数据库之前轻松调整任何对象; 它也应该允许我使用不断变化的数据库模式轻松工作
它应该允许我扩展从数据库映射的对象,例如向它们添加虚拟属性(虚拟列到表)
它必须(至少几乎)与数据库无关,它应该允许我以透明的方式使用不同的数据库
它必须没有那么多配置或必须基于约定才能使其工作
它应该允许我与Linq合作
那么,你知道我可以使用的任何ORM吗?谢谢您的帮助.
编辑我知道一个选项是使用NHibernate.这似乎是企业级应用程序的事实标准,但由于其深度学习曲线,它似乎不是很有效.换句话说,我在SO中读到了其他一些帖子,认为它与Linq不能很好地集成.这一切都是真的吗?
也许你最好的选择是使用NHibernate.对于商业和开源ORM而言,它可以说是最好的"行业标准".它已经在很长一段时间内变得非常稳定,在许多企业公司中使用,是基于更为人所知的Hibernate(java),但已经完全重写以充分利用.NET功能.
这听起来像我是NHibernate的拥护者.也许我是.但NHibernate有一个缺点:它有一个陡峭的学习曲线,并习惯了许多可能性,为你的情况选择正确或"最佳"的做法可能是令人生畏的,即使对于有经验的开发人员.但这是支付几乎任何东西的企业级ORM的奖金.
许多这些缺点和设置问题在您开始使用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() // 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 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)的一个非常强大的功能是在进行任何更改时更新数据库模式.
同样在好的方面:存在许多自动生成工具(包括开源MyGeneration),它们可以从简单的ODBC或其他连接中获取数据库模式,并将它们转换为正确的实体类,关联和HBM配置文件.其中许多工具都是(部分)图形设计辅助工具.
请务必阅读NHibernate的最佳实践.它将泛型和DAO提升到了一个新的水平.您还可以跳过追逐并深入了解S#arp(下载),这是一个强加所有这些最佳实践并将NUnit添加到混合中的框架.
在我开始使用新技术之前,我通常希望它得到很好的覆盖.NHibernate和Hibernate在这里并不简单.许多书籍解释了(N)Hibernate从入门到专业,白皮书丰富,工具文档同时相当出色.
LINQ和NHibernate总是通过ICollection<>
在多对X映射和其他关联中使用的所有类型很好地结合在一起,但是需要首先检索数据,这需要一个好的设计(缓存在这里有帮助),否则它'表现不好.自LINQ问世以来,这一直被认为是NH的痛点.
幸运的是,现在有一个新的孩子:NHibernate-LINQ,它ICriteria
在提交之前将LINQ查询映射到查询.ICriteria查询得到很好的缓存,与LINQ的这种组合非常强大且性能非常高.NH-LINQ现在是标准发行版的一部分.
我已经使用了几乎十年的NHibernate(第一个Java,后来的.NET).我与其他ORM的商业和开源调情,但最终总是回到NH(除非公司政策要求不同,但这种情况很少见).这个故事可能听起来有点偏颇,但这里的空间太短,无法详细介绍NHibernate与其他技术的比较.
其他ORM很有可能更适合您的需求,特别是如果您从未计划在复杂的多数据库,多数据库服务器或难以映射到OO的传统情况下使用它.对我来说,NH闪耀,因为它不会限制我任何方式,并支持完整的往返工程,但如果这里讨论的较轻的ORM的功能对你来说重量较大,你的选择可能会有所不同.
更新:添加代码示例
更新:扩展代码示例,修复错别字和措辞
更新:小章节,添加LINQ部分,添加免责声明部分