当前位置:  开发笔记 > 编程语言 > 正文

我应该使用.net的ORM?

如何解决《我应该使用.net的ORM?》经验,为你挑选了1个好方法。

我是.NET的新手,已经使用Linq2Sql近一年了,但它缺少我现在正在寻找的一些功能.

我将开始一个新项目,我想在其中使用具有以下特征的ORM:

它必须非常高效,我不想处理访问层以保存或从数据库中检索对象,但它应该允许我在实际将其提交到数据库之前轻松调整任何对象; 它也应该允许我使用不断变化的数据库模式轻松工作

它应该允许我扩展从数据库映射的对象,例如向它们添加虚拟属性(虚拟列到表)

它必须(至少几乎)与数据库无关,它应该允许我以透明的方式使用不同的数据库

它必须没有那么多配置或必须基于约定才能使其工作

它应该允许我与Linq合作

那么,你知道我可以使用的任何ORM吗?谢谢您的帮助.

编辑我知道一个选项是使用NHibernate.这似乎是企业级应用程序的事实标准,但由于其深度学习曲线,它似乎不是很有效.换句话说,我在SO中读到了其他一些帖子,认为它与Linq不能很好地集成.这一切都是真的吗?



1> Abel..:

也许你最好的选择是使用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()   // 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)的一个非常强大的功能是在进行任何更改时更新数据库模式.

其他帮助NHibernate

同样在好的方面:存在许多自动生成工具(包括开源MyGeneration),它们可以从简单的ODBC或其他连接中获取数据库模式,并将它们转换为正确的实体类,关联和HBM配置文件.其中许多工具都是(部分)图形设计辅助工具.

使用S#arp强制执行MVC + NH + NUnit最佳实践

请务必阅读NHibernate的最佳实践.它将泛型和DAO提升到了一个新的水平.您还可以跳过追逐并深入了解S#arp(下载),这是一个强加所有这些最佳实践并将NUnit添加到混合中的框架.

在我开始使用新技术之前,我通常希望它得到很好的覆盖.NHibernate和Hibernate在这里并不简单.许多书籍解释了(N)Hibernate从入门到专业,白皮书丰富,工具文档同时相当出色.

关于LINQ和NH

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部分,添加免责声明部分

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有