Nhibernate 为什么我的鉴别器作为代理返回?
在我的一个POCO中,我有一个充当鉴别器的Nhibernate 为什么我的鉴别器作为代理返回?,nhibernate,queryover,discriminator,Nhibernate,Queryover,Discriminator,在我的一个POCO中,我有一个充当鉴别器的状态属性(非常类似于使用枚举) 这里是HBM的一部分,它具有状态列 <many-to-one class="Locate.Common.Domain.Statuses.Status, Locate.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Status"> <column name="Status_id" not-null="true"
状态
属性(非常类似于使用枚举
)
这里是HBM的一部分,它具有状态
列
<many-to-one class="Locate.Common.Domain.Statuses.Status, Locate.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Status">
<column name="Status_id" not-null="true" />
</many-to-one>
最后,这里是我的QueryOver
var locates =
session.QueryOver(() => locateAlias)
.SelectList(x => x
.Select(xx => xx.WorkToBeginDateTime).WithAlias(() => sentTo.DueDate)
.Select(xx => xx.SendTo).WithAlias(() => sentTo.SentTo)
.Select(xx => xx.TicketNo).WithAlias(() => sentTo.TicketNo)
.Select(xx => xx.Status).WithAlias(() => sentTo.Status)
)
.JoinAlias(() => locateAlias.Status, () => statusAlias)
.Where(() => locateAlias.IsComplete == false)
.TransformUsing(Transformers.AliasToBean<SentToDto>()).List<SentToDto>();
查看NHibernate探查器,我可以看到它实际上正在选择正确的状态\u id
我是HBM还是query有什么问题
请注意,我能够成功地查询所有状态并接收所有状态鉴别器对象的列表。我还可以看到生成的代理对象包含
Status
对象的正确值,因此NHibernate正确地返回了正确的值。您的查询无法获取Status属性,稍后,当您访问Status时,加载该属性的会话已经关闭。因此,不要使用.JoinAlias(()=>locateAlias.Status,()=>statusAlias)
而使用.Fetch(locate=>locate.Status).Eager
编辑:我验证过,这是因为选择的状态并没有被急切地获取。如果返回一个locate对象,它将是唯一的急取。你可以做:
var locates =
session.QueryOver(() => locateAlias)
.Where(() => locateAlias.IsComplete == false)
.Fetch(locate => locate.Status).Eager
.ToEnumerable()
.Select(locate => new SentToDto
{
DueDate = locate.WorkToBeginDateTime,
SendTo = locate.SendTo,
TicketNo = locate.TicketNo,
Status = locate.Status,
}.ToList();
我已经试过了,但是
Fetch
对多对一关系不起作用。@gcso?为什么不呢?我在一个示例应用程序中进行了尝试,Fetch在多对一上运行良好。Fetch
states的文档指定了一种关联抓取策略。目前,仅支持一对多和一对一关联。
。我想知道我错过了什么。
Initializing[Locate.Common.Domain.Statuses.Status#2]-Could not initialize proxy - no Session.
var locates =
session.QueryOver(() => locateAlias)
.Where(() => locateAlias.IsComplete == false)
.Fetch(locate => locate.Status).Eager
.ToEnumerable()
.Select(locate => new SentToDto
{
DueDate = locate.WorkToBeginDateTime,
SendTo = locate.SendTo,
TicketNo = locate.TicketNo,
Status = locate.Status,
}.ToList();