使用NHibernate进行查询的最佳实践

11

我使用其他技术(CSLASubsonic)几年后,又回到了使用NHibernate,发现查询有点令人沮丧,特别是与Subsonic相比。我想知道其他人正在使用什么方法?

Hibernate Query Language对我来说感觉不太对,似乎太像写SQL了,这就是我认为使用ORM工具的原因之一,因此我不必,而且它全部在XML中,这意味着它不利于重构,错误只能在运行时被发现?

Criteria Queries似乎不够流畅。

我看到read Ayende's NHibernate Query Generator是一个有用的工具,人们在使用吗?还有别的东西吗?

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


1
我感到同样的沮丧,对我来说,似乎我们正在用一些同样糟糕的东西来替换存储过程,这些东西同样难以开发和维护。 - rshimoda
5个回答

5

LINQ for NHibernate目前仍处于beta版本; 我期待NHibernate 2.1的发布,据说它将最终成为正式版。

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

LINQ for NHibernate: O/R Mapping in Visual Studio 2008 Slides and Code


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方法,它似乎对我更有效。


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>();
  }
}

您询问了重构的问题。由于IDE已经处理了LINQ,因此对于任何剩余的HQL,扫描这些存储库类并手动更改HQL相当容易。

将HQL放入XML文件是一个好习惯,也许可以看看ReSharper NHIbernate插件现在是否能够处理查询重构?

编写或重构查询(HQL或LINQ)时的一个重大改进是将查找器方法放在单元测试下。这样,您可以快速调整HQL/LINQ,直到获得绿色条形图。编译/测试/反馈循环非常快,特别是如果您使用内存数据库进行测试。

此外,如果您在重构后忘记编辑HQL,则单元测试应该能够快速发现您的错误HQL。


1

-1
放弃nHibernate,如果可以的话,回到Subsonic。在我看来,Subsonic是一个更流畅和可测试的ORM/DAL。我绝对讨厌HQL,ORM中弱类型查询有什么意义?为什么我要使用Linq/nH/SQL,而不是直接使用Linq to SQL并省略一层?
当Subsonic还不存在时,nHibernate是一个好的ORM,但现在与Subsonic相比,它就变得非常糟糕了。使用nHibernate做事情需要花费我两倍的时间。由于nHibernate是运行时的,所以测试很麻烦,现在我需要雇用几个QA工程师来“点击”网站,而不是得到编译时错误。

Subsonic在性能和复杂映射方面如何?比NHibernate更好吗? - pabloide86
3
为什么需要雇用一些质量保证工程师,当你可以使用测试工具(如nunit、mbunit等)来完成大部分的测试。nhibernate和我猜想大多数ORM(包括subsonic)在这种情况下都能很好地工作。 - Nathan Fisher
1
“当我可以直接使用Linq to SQL并省略一层时,为什么要使用Linq/nH/SQL呢?” 嗯,首先,Linq2SQL只支持MsSQl服务器。而Linq2NH支持所有NH支持的DBMSs。 - UpTheCreek

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