代码之家  ›  专栏  ›  技术社区  ›  djdd87

使用nhibernate的createCreateCriteria方法时,如何强输入条件?

  •  2
  • djdd87  · 技术社区  · 14 年前

    我现在第一次使用NHibernate,使用流利的NHibernate。我已经很好地完成了所有的设置,但是现在我开始真正地做一些数据检索,它似乎已经不足了。

    我期待着能让我做点什么,比如:

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

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

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

    当我重新命名任何属性时,这就不太好了!我一直认为代码中硬编码的字符串是不好的,特别是当字符串与属性名相关时。

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

    4 回复  |  直到 12 年前
        1
  •  2
  •   djdd87    14 年前

    我决定用 NHibernate.Linq 相反。我找到了一个精彩的教程 here .

        2
  •  1
  •   cbp    14 年前

    你不能使用现成的NHibernate。 有一个项目叫 NHibernate Lambda Extensions 这允许您在某些限制下完成此操作。

        3
  •  1
  •   Firo    12 年前

    由于NHibernate 3.0 QueryOver 这是一个很好的关于标准API的类型安全包装器。

    session.QueryOver<TblDocket>()
        .Where(x => x.DocketNumber, "10101");
    
        4
  •  0
  •   cdmdotnet    14 年前

    对于任何一个不喜欢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 它显示了如何使用helpers类。

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

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