该场景是一个使用 NHibernate 与 SQL Server 数据库交互的 MVC.NET 应用程序。
每个带有 Criteria 的 NHibernate 查询都可以正常工作,除了我添加的最后一个,会出现以下错误:
相关代码如下:
session = NHibernateSessionManager.Instance.GetSession();
ICriteria criteria = session.CreateCriteria(typeof(Alarms));
criteria.Add(Expression.Eq("Reading.Truck.Company.CompanyId", companyId));
alarmsList = criteria.List<Alarms>();
嵌套属性在相关类文件中定义,如下所示:
闹钟.cs
private AlarmsReading _Reading;
public AlarmsReading Reading
{
get { return _Reading; }
set { _Reading= value; }
}
这些属性在映射文件中定义如下:
警报.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>();
关于c# - NHibernate 和 C# : error using nested properties with Criteria,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33669012/