Fluent NHibernate - NHibernate.QueryException:无法解析属性

Posted

技术标签:

【中文标题】Fluent NHibernate - NHibernate.QueryException:无法解析属性【英文标题】:Fluent NHibernate - NHibernate.QueryException: could not resolve property 【发布时间】:2014-12-13 15:00:21 【问题描述】:

首先,是的,Stack Overflow 上有很多类似的问题,但我已经浏览了所有这些问题,困扰大多数问题的问题在我的问题上看起来是正确的。

基本上,我试图通过查询访问对象的对象,这可能是问题所在:不允许这样做吗?我始终可以访问 Id 字段,但无法访问任何其他成员变量。

这是我的对象:

public class Logfiles

    public virtual int Id  get; set; 
    public virtual bool IsActive  get; set; 
    public virtual DateTime LastReference  get; set; 


public class LogMerges

    public virtual int Id  get; set; 
    public virtual DateTime CreationDate  get; set; 
    public virtual Logfiles Logfile  get; set; 

这是我的映射:

class LogfilesMap : ClassMap<Logfiles>

    public LogfilesMap()
    
        Not.LazyLoad();
        Table("logfiles");
        Id(x => x.Id, "id").Not.Nullable().Unique().GeneratedBy.Identity().UnsavedValue(0);
        Map(x => x.IsActive, "is_active").Not.Nullable().Default("true");
        Map(x => x.LastReference, "last_reference").Not.Nullable();
    


class LogMergesMap : ClassMap<LogMerges>

    public LogMergesMap()
    
        Not.LazyLoad();
        Table("logmerges");
        Id(x => x.Id, "id").Not.Nullable().Unique().GeneratedBy.Identity().UnsavedValue(0);
        Map(x => x.CreationDate, "creation_date").Not.Nullable();
        References(x => x.Logfile, "logfile_id");
    

我的表和列的名称:

logfiles  - id, is_active, last_reference
logmerges - id, creation_date, logfile_id

我用来查询的代码:

var query = session.QueryOver<LogMerges>()
    .Where(log => log.Logfile.IsActive == true);
IEnumerable<LogMerges> logmerges = query.List().OrderBy(c => c.CreationDate);

执行查询会导致错误并生成:

NHibernate.QueryException:无法解析属性:Logfile.IsActive of:LogMerges

我唯一能猜到的是,我不允许在这些查询中执行“log.Logfile.IsActive”对象链。它编译得很好,我不明白为什么我不能这样做。如果我将其更改为:

var query = session.QueryOver<LogMerges>()
    .Where(log => log.Logfile.Id == 0);

...查询通过。但是,如果我尝试访问其他成员变量:

var query = session.QueryOver<LogMerges>()
    .Where(log => log.Logfile.LastReference == DateTime.Now);

...我收到类似的“无法解析属性”错误消息。

所以如果我不能做“log.Logfile.IsActive”的对象链,那么实现它的正确方法是什么?我需要执行一堆 JOIN 来执行此操作吗?

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

是的,您确实需要在Logfile 上发送join。 Nhibernate 最终会将您的 QueryOver 查询转换为 SQL,因此访问引用表上的属性没有意义。换句话说,你不能写 SQL:

select
    *
from
    logmerges
where
    logmerges.logfile.last_reference = ...

显然你会在这里遇到语法错误——你需要joinLogFile

select
    *
from
   logmerges
   inner join logfiles on logfiles.id = logmerges.logfile_id
where 
   logfiles.last_reference = ...

因此,您也不能这样编写 QueryOver。

var query = session.QueryOver<LogMerges>()
    .JoinQueryOver(lm => lm.LogFile)
    .Where(lf => lf.LastReference == DateTime.Now)
    .List<LogMerges>();

【讨论】:

非常感谢安德鲁,您的快速回复!它工作得很好!我的 SQL 不是特别强,总是对 Joins 感到困惑,所以非常感谢您的帮助!

以上是关于Fluent NHibernate - NHibernate.QueryException:无法解析属性的主要内容,如果未能解决你的问题,请参考以下文章

用 Fluent Nhibernate 定义 NHibernate 过滤器的语法?

Fluent NHibernate and Mysql,SQLite

Fluent NHibernate - NHibernate.QueryException:无法解析属性

Fluent Nhibernate and Stored Procedures

Fluent 映射和 NHibernate Xml 配置

Castle Windsor 3 + Fluent NHibernate + Castle.NHibernate.Integration