【问题标题】:Fluent NHibernate or NHibernate for Linq?流利的 NHibernate 或用于 Linq 的 NHibernate?
【发布时间】:2014-06-30 21:02:43
【问题描述】:

Fluent NHibernate 还是 NHibernate,我们应该更喜欢哪一个来支持 linq?

【问题讨论】:

  • 这根本没有意义。这就像问您是否更喜欢 Windows 或 Word 来支持 PDF。
  • @mlarsen - 虽然我赞成你的评论,因为我喜欢这个类比,但我认为我们不应该让 Sergen 很难问这个问题。这是一个面向所有人的编程问答网站,包括初学者。 NHibernate 可能会让新手非常困惑。不要把你挑出来,很多时候我从这个网站上回答问题的许多人那里感觉到一种比你更神圣的态度,好像提问的人应该更清楚。不应该这样。如果有人完全不熟悉 Windows 或 Word,我不介意哪个更适合 PDF 支持。

标签: c# nhibernate fluent-nhibernate linq-to-nhibernate


【解决方案1】:

Fluent NHibernate 来自 Configuration,Linq 用于查询。他们做不同的事情,你可以同时使用两者。 Fluent NHibernate 不是 NHibernate 或 Linq 的替代品,而只是一个帮助程序库,可帮助您在代码中配置 NHibernate,而不是使用 XML 文件。

【讨论】:

  • 仍然 - 你会选择哪一个? :o)
  • @Arnis:两者都有。我就是这么做的。
  • @Arnis 这仍然是一个无效的“或”问题。
  • NHibernate 也有它自己的 Fluent 映射系统,现在称为 Conformist(从 NHibernate 3.2 iirc 开始),它是 Fluent NHibernate 的合适替代品。如果您是从头开始,我建议您使用 Conformist,因为它的依赖性少了 1 个。
【解决方案2】:

当您使用 NHibernate 时,您会为您的对象和查询 (LINQ) 创建映射以对这些对象进行 CRUD。 NHibernate 使用 XML 映射文件。 Fluent NHibernate 只是根据约定或任何其他可能的方式为您生成这些映射文件。因此,您是否使用 FNHib 并不重要。您仍然可以使用 Linq、Hql、Criteria 或 QueryOver 查询您的对象,并且您仍然可以使用 NHibernate。

【讨论】:

    【解决方案3】:

    NHibernate - 在 XML

    中编写配置

    Fluent NHibernate - 在 C#VB.NET 中使用类型安全编写配置

    如果你希望它类型安全并且讨厌用 XML 编写配置,你应该选择 Fluent NHibernate。因此,您可以轻松地重命名和重构任何更改。您只需键入 dot,intellisense 将在文档方面为您提供很多帮助。编写第一个配置只需要时间,但一旦你知道它就很容易。

    Fluent NHibernate 中的

    Linq 与 NHibernate 本身是一样的。因为与其他答案一样,Fluent NHibernate 仅用于配置并易于使用 NHibernate,其余部分来自 NHibernate。例如:

            var maleCustomers = (from t in Session.Query<Entities.Customer>()
                       where t.Gender == Gender.Male
                       select t).ToList();
    

    我使用 Fluent NHibernate,但是当您右键单击 .Query&lt;&gt;“转到定义”时,您会发现它来自 namespace NHibernate.Linq。所以无论哪种方式实际上都是您使用相同的 Linq。

    如果您说 NHibernate 的 Linq 与 Sql 的内置 Linq 是不同的。我不太确定有什么区别。我以为是一样的,但是当我尝试以更复杂的方式查询时,它会抛出异常或只是一个空的 Sql 查询。

    结论:无论你为Linq选择哪种方式都是一样的,都是NHibernate Linq

    【讨论】:

      【解决方案4】:

      Fluent for NHibernate 在 CodeFirst 环境中运行良好,您可以在其中与 DBA 团队(如果有的话)定义数据库约定。这会从您的 POCO 中创建一个非常一致的物理模型。

      就遗留数据库而言,几乎总是需要 Fluent Overrides 来处理数据库不够一致而无法使用 Fluent 约定的情况。 Fluent Automapping 也可以通过创建自定义属性并从您的自动映射约定中读取来轻松扩展。

      就查询而言,您不太可能只想使用 LINQ 进行查询。 NHibernate LINQ 实现和一般的 LINQ 并不总是像您想要的那样描述您的连接和查询。例如,在撰写本文时,NHibernate LINQ 实现不支持 LEFT OUTER JOINS。 LINQ 可以非常容易阅读,而且大多数情况下它运行良好,但为了更好地控制,您可能希望将 HQL 或 ICriteria 查询与 LINQ 查询一起使用。

      我通常打开 show_sql 以及用于 log4net 的 NHibernate.SQL 记录器,并查看我的查询创建的 SQL 到 DB。

      在我想控制我的连接或“急切获取”的情况下,我有时会选择HQLICriteria,这让我可以更好地控制 NHibernate 对我的查询所做的操作。

      从本质上讲,Fluent 为映射对象提供了很大的灵活性,并且方法(LINQ、HQL 和 ICritieria)的组合允许您处理几乎任何查询/调整情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 2013-11-07
        相关资源
        最近更新 更多