Nhibernate 如何在Hibernate中映射由查询支持的只读属性

Nhibernate 如何在Hibernate中映射由查询支持的只读属性,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我想知道如何最好地实现一个由查询支持的只读属性(这里是LatestRequest) 在这里,我有一个导出,它可以被请求发生多次。我想在导出上有一个属性,以获取最新的ExportRequest。目前,我有一个多对一的映射公式,如下所示: <class name="Export" table="Exports"> <id name="Id"> <generator class="guid" /> </id> <pro

我想知道如何最好地实现一个由查询支持的只读属性(这里是
LatestRequest

在这里,我有一个导出,它可以被请求发生多次。我想在导出上有一个属性,以获取最新的
ExportRequest
。目前,我有一个多对一的映射公式,如下所示:

 <class name="Export" table="Exports">
   <id name="Id">
     <generator class="guid" />
   </id>
   <property name="Name" />
   <bag name="Requests" cascade="all,delete-orphan" inverse="true" access="field.camelcase" order-by="CreationDate desc">
     <key column="ExportId"/>
     <one-to-many class="ExportRequest"/>
   </bag>
   <many-to-one name="LatestRequest"
                class="ExportRequest"
                formula="(select top 1 ExportRequests.Id from ExportRequests order by ExportRequests.CreationDate desc)"/>
 </class>

 <class name="ExportRequest" table="ExportRequests">
   <id name="Id">
     <generator class="native" />
   </id>
   <many-to-one name="Export"
       class="Export"
       column="ExportId"
       not-null="true" />
   <property name="CreationDate" />
   <property name="Tag" />
 </class>
class Export
{
  private IList<ExportRequest> requests;

  ExportRequest LatestRequest { get; private set; }

  public void AddRequest (ExportRequest request)
  { 
    requests.Add(request);
    LatestRequest  = request;
  }
}
那么,实现
LatestRequest
属性的最佳方法是什么


我可以更改
LatestRequest
的getter,以便它执行
Find
查询,该查询应该是最新的,但我不确定如何使导出知道会话。

有几种方法可以解决此问题。我可能不会用这种方式让它“自动”。为了提高性能和简单性,我只需将其作为一个普通引用,并在业务逻辑或实体中对其进行管理,如下所示:

 <class name="Export" table="Exports">
   <id name="Id">
     <generator class="guid" />
   </id>
   <property name="Name" />
   <bag name="Requests" cascade="all,delete-orphan" inverse="true" access="field.camelcase" order-by="CreationDate desc">
     <key column="ExportId"/>
     <one-to-many class="ExportRequest"/>
   </bag>
   <many-to-one name="LatestRequest"
                class="ExportRequest"
                formula="(select top 1 ExportRequests.Id from ExportRequests order by ExportRequests.CreationDate desc)"/>
 </class>

 <class name="ExportRequest" table="ExportRequests">
   <id name="Id">
     <generator class="native" />
   </id>
   <many-to-one name="Export"
       class="Export"
       column="ExportId"
       not-null="true" />
   <property name="CreationDate" />
   <property name="Tag" />
 </class>
class Export
{
  private IList<ExportRequest> requests;

  ExportRequest LatestRequest { get; private set; }

  public void AddRequest (ExportRequest request)
  { 
    requests.Add(request);
    LatestRequest  = request;
  }
}
类导出
{
私人IList请求;
ExportRequest LatestRequest{get;private set;}
公共无效添加请求(导出请求)
{ 
请求。添加(请求);
LatestRequest=请求;
}
}
因此,您不需要任何特殊的映射,也不需要任何额外的查询来获取最新的请求。而且,最重要的是,实体在内存中是一致的,不依赖于持久性

无论您如何解决它,实体和业务逻辑管理数据(在内存中)都是非常重要的。它应该是“无知的坚持”。数据库和数据访问层不负责管理实体的关系和逻辑