【问题标题】:How do I strongly type criteria when using NHibernate's CreateCriteria method?使用 NHibernate 的 CreateCriteria 方法时如何强类型标准?
【发布时间】:2010-07-28 07:02:06
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: nhibernate criteria strong-typing


    【解决方案1】:

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

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      从 NHibernate 3.0 开始,还有 QueryOver 可用,它是标准 API 的一个很好的类型安全包装器。

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

      【讨论】:

        【解决方案4】:

        对于看到这篇文章但不喜欢 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,如上所示),因此您不必一遍又一遍地复制相同的代码。

        【讨论】:

          猜你喜欢
          • 2012-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多