2

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

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

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

但是,情况似乎并非如此,我似乎必须写:

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

当我重命名任何属性时,这将不太好!我一直认为代码中的硬编码字符串不好,尤其是当字符串与属性名称相关时。

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

4

4 回答 4

2

我决定改用NHibernate.Linq我在这里找到了一个很棒的教程。

于 2010-07-28T09:53:51.453 回答
1

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

于 2010-07-28T08:37:46.233 回答
1

自 NHibernate 3.0 以来,还QueryOver提供了一个很好的类型安全包装器,围绕标准 API。

session.QueryOver<TblDocket>()
    .Where(x => x.DocketNumber, "10101");
于 2012-04-10T10:14:35.513 回答
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),因此您不必一遍又一遍地复制相同的代码。

于 2010-07-29T22:12:50.870 回答