jch*_*sor 4 mapping nhibernate fluent-nhibernate queryover
首先,是的,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; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的映射:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
我的表和列有以下名称:
logfiles - id, is_active, last_reference
logmerges - id, creation_date, logfile_id
Run Code Online (Sandbox Code Playgroud)
我用来查询的代码:
var query = session.QueryOver<LogMerges>()
.Where(log => log.Logfile.IsActive == true);
IEnumerable<LogMerges> logmerges = query.List().OrderBy(c => c.CreationDate);
Run Code Online (Sandbox Code Playgroud)
执行查询会导致错误并生成:
NHibernate.QueryException:无法解析属性:Logfile.IsActive:LogMerges
我唯一可以猜到的是,我不允许在这些查询中执行"log.Logfile.IsActive"对象链.它编译得很好,我不明白为什么我不能这样做.如果我将其更改为:
var query = session.QueryOver<LogMerges>()
.Where(log => log.Logfile.Id == 0);
Run Code Online (Sandbox Code Playgroud)
...查询通过.但是,如果我尝试访问其他成员变量:
var query = session.QueryOver<LogMerges>()
.Where(log => log.Logfile.LastReference == DateTime.Now);
Run Code Online (Sandbox Code Playgroud)
...我得到一个类似的"无法解析属性"错误消息.
因此,如果事实证明我不能做"log.Logfile.IsActive"的对象链,那么实现它的正确方法是什么?我需要执行一堆JOIN才能执行此操作吗?
在此先感谢您的帮助!
是的,你确实需要join开启Logfile.Nhibernate最终会将您的QueryOver查询转换为SQL,因此访问引用表上的属性没有意义.换句话说,你无法编写SQL:
select
*
from
logmerges
where
logmerges.logfile.last_reference = ...
Run Code Online (Sandbox Code Playgroud)
很明显,你会在这里得到一个语法错误- you'd需要join到LogFile:
select
*
from
logmerges
inner join logfiles on logfiles.id = logmerges.logfile_id
where
logfiles.last_reference = ...
Run Code Online (Sandbox Code Playgroud)
因此,您也无法像这样编写QueryOver.
var query = session.QueryOver<LogMerges>()
.JoinQueryOver(lm => lm.LogFile)
.Where(lf => lf.LastReference == DateTime.Now)
.List<LogMerges>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7152 次 |
| 最近记录: |