11

在使用其他技术( CSLASubsonic)几年后,我又开始使用 NHibernate ,我发现查询有点令人沮丧,尤其是与 Subsonic 相比。我想知道人们正在使用哪些其他方法?

Hibernate Query Language 对我来说感觉不对,似乎太像编写 SQL,在我看来这是使用 ORM 工具的原因之一,所以我不必这样做,而且它都是 XML,这意味着它是重构不好,错误只会在运行时发现?

标准查询,似乎不够流畅。

读过Ayende 的 NHibernate Query Generator是一个有用的工具,这是人们正在使用的吗?还有什么?

编辑:值得一读 http://www.ayende.com/Blog/archive/2007/03/17/Implementing-Linq-for-NHibernate-A-How-To-Guide--Part.aspx

4

5 回答 5

5

NHibernate 的 LINQ 仍处于测试阶段;我期待 NHibernate 2.1,他们说它最终会成功。

大约一个月前,我做了一个关于 NHibernate 的 LINQ 的演示,您可能会发现它很有用。我在这里写了一篇博客,包括幻灯片和代码:

NHibernate 的 LINQ:Visual Studio 2008 幻灯片和代码中的 O/R 映射

于 2008-09-04T09:32:59.950 回答
3

要摆脱 XML,请尝试Fluent NHibernate

Linq2NH 还没有完全出炉。核心团队正在研究一种与 NH Contrib 中不同的实现。它虽然适用于简单的查询。为了获得最佳效果,请谨慎使用。

至于如何查询(hql vs. Criteria vs. Linq2NH),在您的存储库接口上公开意图揭示方法(GetProductsForOrder(Order order)、、GetCustomersThatPurchasedProduct(Product product)等)并以最佳方式实现它们。使用 hql 可能更容易进行简单查询,而使用规范模式您可能会发现 Criteria API 更适合。这些东西只是封装在您的存储库中,如果您的测试通过,那么您如何实现并不重要。

我发现 Criteria API 很繁琐且限制性强,但很灵活。HQL 更像是我的风格(它比 SQL 更好——它是基于对象的,而不是基于模式的),并且对于简单的 GetX 方法似乎更适合我。

于 2008-09-07T03:21:07.647 回答
1

我默认使用 Linq for NHibernate。当我遇到错误或限制时,我会切换到 HQL。

如果您将所有查询放在一个数据访问类(例如存储库)中,这是一种干净的方法。

public class CustomerRepostitory()
{ 
  //LINQ for NHibernate     
  public Customer[] FindCustomerByEmail(string email)
  {
     return (from c in _session.Linq<Customer>() where c.Email == email).FirstOrDefault();
  }

  //HQL
  public Customer[] FindBestBuyers()
  {
    var q = _session.CreateQuery("...insert complex HQL here...");
    return q.List<Customer>();
  }
}

你问过重构。LINQ 显然由 IDE 处理,因此对于任何剩余的 HQL,扫描这些存储库类并手动更改 HQL 相当容易。

将 HQL 放入 XML 文件是一个很好的做法,也许看看ReSharper NHIbernate 插件现在是否可以处理查询重构?

编写或重构查询(HQL 或 LINQ)时的一改进是将 finder 方法置于unit test之下。这样,您可以快速调整 HQL/LINQ,直到获得绿色条。编译/测试/反馈循环非常快,特别是如果您使用内存数据库进行测试。

此外,如果您在重构后忘记编辑 HQL,单元测试应该会很快让您知道损坏的 HQL。

于 2008-10-15T20:16:17.387 回答
1

LINQ-to-NHibernate 和 Ayende 的 NHQG 的替代方法是从 C#3 表达式生成 NHibernate 表达式/限制。通过这种方式,您可以获得更强类型的 Criteria API。

看:

于 2008-12-01T23:24:28.347 回答
-1

如果可以,请废弃 nHibernate 并返回到 Subsonic。在我看来,Subsonic 是一种更加流畅和可测试的 ORM/DAL。我绝对讨厌 HQL ORM 中弱类型查询的意义何在?当我可以使用 Linq to SQL 并切出一层时,为什么还要使用 Linq/nH/SQL?

当 Subsonic 不存在时,nHibernate 是一个很好的 ORM,但现在,与之相比,它简直太糟糕了。使用 nHibernate 与 Subsonic 做事情很容易花费我 2 倍的时间。测试很痛苦,因为 nHibernate 是运行时的,所以现在我需要聘请一些 QA 工程师在站点周围“单击”而不是出现编译时错误。

于 2009-02-04T19:54:01.307 回答