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=请求;
}
}
因此,您不需要任何特殊的映射,也不需要任何额外的查询来获取最新的请求。而且,最重要的是,实体在内存中是一致的,不依赖于持久性
无论您如何解决它,实体和业务逻辑管理数据(在内存中)都是非常重要的。它应该是“无知的坚持”。数据库和数据访问层不负责管理实体的关系和逻辑