NHibernate还是Fluent NHibernate?

35

我很想听听其他人关于选择哪个的意见(请不要回答“都不选”),以及为什么选择它。

使用Fluent有哪些缺点?(例如版本依赖关系) 优缺点、经验等。


1
hbm.xml文件在NHibernate中用于映射,但Fluent NHibernate在C#代码中替换了它。这样很容易找到问题并进行维护。 - user725388
3
我三年前提出了这个问题,但这个月它被关闭了?哎呀。 - UpTheCreek
5个回答

52

Fluent NHibernate是基于NHibernate的,所以并不是两者之间的选择。如果您要使用NHibernate,则应选择在其上使用Fluent NH,以节省大量精力。

Fluent NHibernate令人惊叹,没有它我不会使用NHibernate。您可以流畅地映射所有实体(使您具有编译时检查和自动化测试支持),而无需维护繁琐的XML文件并记住其语法/ DTD。

它还可以根据默认和/或您自己的自定义约定自动映射实体。

只需使用它!


是的,抱歉我应该稍微改一下我的问题的措辞;) 谢谢你的回答。 - UpTheCreek
是的,我完全同意。我们曾经在Rhino和Geo库旁边使用Fluent。我们偶尔会遇到版本不一致的情况! - Perhentian
我完全同意。我刚开始使用Fluent NHibernate,再也不会回头了。映射你的类是多么容易,真是太神奇了。 - Siewers
1
流利是否不再受支持了? - Johnny_D
@Johnny_D 它还没有死,但自从 Mapping by Code 进入游戏场地以来,开发速度减缓了很多。 - Firo

13

我建议使用Fluent NHibernate。但是请注意,可能不会像您希望的那样顺利。

  1. 关于版本依赖

    1. 在升级到新版本的FNH时,我遇到了反向依赖问题,需要我升级到NH的新版本(我认为是从2.0到2.1)。这对我来说不是一个重大问题。
    2. 刚刚(今天早上)将NH 2.1.1放入FNH 1.0 RTM中而没有遇到任何问题(至少目前还没有)。
  2. 编辑:自撰写此文章以来,FNH已经显著成熟,我认为这不再是一个真正的问题了 映射支持-某些映射目前使用Fluent NHibernate无法实现。然而,这并不是避免FNH的理由,因为混合使用Fluent-XML映射使您可以在Fluent无法映射它时退回传统XML(尽管每个类只有一个)。映射示例:

    1. 目前无法映射字段-http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/a7787927dafd23a/84ce2616946a18d7
    2. 无法映射某些类型的字典http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/d38b6c72250cd2fb -实际上,据我所了解,这种功能已经存在,但还没有进入主线。
  3. 复合复杂度因子。听起来你将同时学习FNH和NH。对于大多数相当简单的应用程序来说,这是可以接受的 - 实际上,FNH通常非常好,你需要了解关于hbm.xml映射的很少知识。但是,如果你想做一些相当复杂的事情,第一次很少能成功,你会想知道这是否是PEBKAC、流畅或NH的问题。比我希望的更经常地,我最终写下了传统的xml映射(当然,无论如何,你都要这样做,但最好不要浪费更多精力来摆弄流利)。


谢谢你的想法 - 我明白你在第三点上的观点。最终我选择了FNH,但我也在做一个小项目,不使用Fluent - 这是一个非常好的想法,因为我感觉我正在学习很多关于NH的知识,并且更加舒适地了解到实际发生的事情。 (顺便说一句,我不得不查找PEBKAC的含义,但是是的 - 这是我大部分问题的根源;)) - UpTheCreek
3
仅供参考,最新版本已支持字段。 - James Gregory
你可以随时从流畅的映射中生成hbm.xml文件,并手动编辑它们。无需全部手写。 - Firo
我想补充一点,使用Fluent配置和PersistenceSpecification进行单元测试映射变得非常容易。 - Firo
Fluent仍然不允许映射具有自定义参数化类型的属性。在尝试解决https://nhibernate.jira.com/browse/NH-2528的后果时遇到了这个问题。 - bushed

9
使用Fluent NHibernate和NHibernate的优点是,如果您弄乱了映射,您将在编译时获得错误提示,而不是运行时错误。当您重构代码时,您还会获得更好的体验,因为随着您重命名属性或其他操作,您的映射将保持最新状态,而不必记住手动修改XML映射文件。
Fluent NHibernate最大的缺点是它仍处于开发的早期阶段,随着框架的发展,存在相当大的变更风险。

1
根据我的经验,使用FluentNHibernate时出现的大多数错误都是由于错误映射,在应用程序中首次使用NHibernate时会发生。只有简单的重构/类型不匹配/拼写错误等会导致编译时错误。 - quentin-starin

4

就我个人而言,我并没有深入研究流畅的nhibernate,因为我已经习惯了映射文件。使用Visual Studio创建映射文件非常简单,您可以设置XML文件的模式,这样您就可以在映射文件上使用Intellisense。我同意使用流畅的nhibernate具有编译时语法检查的优点,但是当我已经熟悉XML映射时,我很难证明学习流畅API的必要性。也许我应该克服我的惰性并开始学习它... :-)


2

Fluent N-Hibernate是NHibernate的一个很好的封装。使用Fluent来管理映射比使用xml映射更好。一旦开始使用Fluent,开发速度就会变得更快...

如果您使用Entity Developer创建实体和数据库架构,则效果最佳。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接