NHibernate和C#:使用Criteria的嵌套属性时出错

该场景是一个使用NHibernate与SQL Server数据库交互的MVC.NET应用程序.

使用Criteria的每个NHibernate查询都可以正常工作,除了我添加的最后一个,它会产生以下错误:

could not resolve property: Reading.Truck.Company.CompanyId of: ADO.Alarms

相关代码如下:

session = NHibernateSessionManager.Instance.GetSession();
            ICriteria criteria = session.CreateCriteria(typeof(Alarms));
            criteria.Add(Expression.Eq("Reading.Truck.Company.CompanyId", companyId));

            alarmsList = criteria.List<Alarms>();

嵌套属性在相关的类文件中定义,如下所示:
Alarms.cs

private AlarmsReading _Reading;  
public AlarmsReading Reading
    {
        get { return _Reading; }
        set { _Reading= value; }
    }

这些属性在映射文件中定义,如下所示:

Alarms.hbm.xml

<hibernate-mapping  ...>
<class name="Alarms" table="Alarms" lazy="false">
<cache usage="read-write"/>
...
<many-to-one name="Reading" class="AlarmsReading">
  <column name="Reading_Id" not-null="true"/>
</many-to-one>
...
</class>
</hibernate-mapping>

所有其他标准查询,与其他嵌套属性,定义相同的方式,工作正常.

奇怪的是,如果我使用普通的IQuery语法和createQuery方法,一切都很顺利;那是:

session = NHibernateSessionManager.Instance.GetSession();
IQuery query = null;
query = session.CreateQuery("FROM Alarms al WHERE Reading.Truck.Company.CompanyId = (:companyId) ");
query.SetParameter("companyId", companyId);
alarmsList = query.List<Alarms>();

我也找到了这个similar question,我知道有各种方法可以解决,但我正在寻找这种不端行为的原因.

任何帮助将不胜感激.
先感谢您.

最佳答案 好.

我已经了解了如何正确使用Criteria,阅读 this post的答案,以及在NHibernate官方网站上的 this example.

带有Criteria的点表示法似乎只适用于当前对象的组件(及其属性:即Reading.ReadingId).

如果我们想要更深入的属性,我们将使用Associations.

所以这段代码适用于我的任务:

session = NHibernateSessionManager.Instance.GetSession();
ICriteria criteria = session.CreateCriteria(typeof(Alarms));
criteria.CreateCriteria("Reading").CreateCriteria("Truck")
        .Add(Expression.Eq("Company.CompanyId", companyId));

alarmsList = criteria.List<Alarms>();
点赞