我是.NET的新手,已经使用Linq2Sql近一年了,但它缺少我现在正在寻找的一些功能.
我将开始一个新项目,我想在其中使用具有以下特征的ORM:
那么,你知道我可以使用的任何ORM吗?谢谢您的帮助.
编辑我知道一个选项是使用NHibernate.这似乎是企业级应用程序的事实标准,但由于其深度学习曲线,它似乎不是很有效.换句话说,我在SO中读到了其他一些帖子,认为它与Linq不能很好地集成.这一切都是真的吗?
Abe*_*bel 22
也许你最好的选择是使用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<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
}
Run Code Online (Sandbox Code Playgroud)
它接受所有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部分,添加免责声明部分
归档时间: |
|
查看次数: |
5002 次 |
最近记录: |