使用NHibernate查询的最佳实践

时间:2008-09-04 09:21:26

标签: nhibernate orm

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

Hibernate查询语言对我来说感觉不对,看起来就像编写SQL一样,在我看来这是使用ORM工具的原因之一,所以我不需要,而且全部是XML,这意味着重构效果不佳,只会在运行时发现错误?

标准查询,看起来不够流畅。

read Ayende的NHibernate Query Generator,是一个有用的工具,人们正在使用它?还有什么呢?

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

5 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

要摆脱XML,请尝试Fluent NHibernate

Linq2NH尚未完全出炉。核心团队正在开发一种与NH Contrib不同的实施方案。它适用于简单的查询。如果有最佳效果,请谨慎使用。

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

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

答案 2 :(得分: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 plugin现在是否可以处理查询重构?

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

另外,如果您在重构后忘记编辑HQL,单元测试应该会让您快速了解损坏的HQL。

答案 3 :(得分:1)

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

请参阅:

答案 4 :(得分:-1)

废弃nHibernate,如果可以,请回到Subsonic。在我看来,Subsonic是一个更加流畅和可测试的ORM / DAL。我绝对讨厌HQL在ORM中弱类型查询的重点是什么?当我可以使用Linq to SQL并删除一个图层时,为什么我会使用Linq / nH / SQL?

当Subsonic不在时,nHibernate是一个很好的ORM,但是现在,与之相比,这简直太糟糕了。使用nHibernate和Subsonic进行操作时,我需要花费2倍的时间。测试很痛苦,因为nHibernate是运行时,所以现在我需要聘请一些QA工程师来“点击”网站,而不是出现编译时错误。