在使用NHibernate的CreateCriteria方法时,如何强烈键入条件?

时间:2010-07-28 07:02:07

标签: nhibernate criteria strong-typing

我目前正在使用NHibernate,第一次使用Fluent NHibernate。我已经很好地完成了所有设置,但是现在我实际上已经进行了一些数据检索,它似乎已经不足了。

我期待NHibernate,允许我做类似的事情:

session.CreateCriteria<TblDocket>()
    .Add(Restrictions.Eq(x=> x.DocketNumber, "10101"));

然而,这似乎并非如此,我似乎不得不写:

session.CreateCriteria<TblDocket>()
    .Add(Restrictions.Eq("DocketNumber", "10101"));

当我重命名任何属性时,那将是不太精彩的!我总是认为代码中的硬编码字符串很糟糕,特别是当字符串与属性名称相关时。

有什么方法可以强烈地输入这些限制吗?我查看了this博客文章,但看起来很乱,有没有更好的解决方案?

4 个答案:

答案 0 :(得分:2)

我决定使用NHibernate.Linq代替。我找到了一个精彩的教程here

答案 1 :(得分:1)

你不能使用开箱即用的NHibernate。 有一个名为NHibernate Lambda Extensions的项目允许您在某些限制下执行此操作。

答案 2 :(得分:1)

因为NHibernate 3.0还有QueryOver可用,它们是标准API的一个很好的类型安全包装。

session.QueryOver<TblDocket>()
    .Where(x => x.DocketNumber, "10101");

答案 3 :(得分:0)

对于任何来这篇文章并且不喜欢linq或者不太熟悉lambda的人,你仍然可以安全地使用ICrierta等

session.CreateCriteria<TblDocket>().Add(Restrictions.Eq("DocketNumber", "10101"));

你需要的是帮助程序类,所以你可以删除魔术字符串,如“DocketNumber”,这样如果你确实更改了你的属性名称或列名,这些就会为你处理,或者至少产生一个构建错误,所以你知道在您发布代码之前。 想要查看示例的任何人都可以查看NhGen(http://sourceforge.net/projects/nhgen/)以及https://sourceforge.net/projects/nhgen/forums/forum/1169117/topic/3789112处的查询示例,其中显示了如何使用帮助程序类。

// Find using a simple entity query 
IList<IMessage> messageList3 = messageDao.Find( new [] { Restrictions.Le(MessageHelper.Columns.Date, dateLastChecked) } ); 

请注意,此项目还创建了实体包装类,它将所有常见的CRUD方法组合为一个类(xxxDao如上所示),因此您不必一遍又一遍地复制相同的代码。