Nhibernate 为什么我的鉴别器作为代理返回?

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"

在我的一个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" />
</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();