假设我的域名如下:
我需要保留数据库中车辆的所有OdometerReadings的历史记录,但不希望整个里程表历史记录属于Vehicle对象。我想要的是OdometerReading属性映射到数据库中最新的OdometerReading条目。
我想过将OdometerReadings的整个集合映射到Vehicle,并且有一个名为CurrentOdometerReading的动态属性可以对它们进行排序并返回最新的属性,但我不需要在我的域中的Vehicle下的整个集合,并且好像我会从数据库中获取比我需要的更多的数据。
NHibernate可以吗?我如何绘制这样的东西?
答案 0 :(得分:1)
根据您希望域模型的外观,有几种方法可以执行此操作。我首选的是使用自定义集合类型,例如IOdometerReadingCollection,您可以添加额外的方法。在这种情况下,它可能类似于:
public interface IOdometerReadingCollection : IList<OdometerReading>
{
OdometerReading Latest { get; }
}
这样你就可以:
OdometerReading reading = vehicle.OdometerReadings.Latest;
我更喜欢:
OdometerReading reading = vehicle.LatestOdometerReading;
有很多关于自定义收藏的文档,您可以通过简单的谷歌搜索找到它们。
如果这种方法不适合您,还有其他选择。您可以使用具有公式的属性(我不确定它是否适用于复杂类型?),或者是常规的NHibernate关联,其中您的车辆映射上有最新的OdometerReading的关键字。正如您所提到的,您可以加载所有OdometerReadings,这取决于您的使用情况,实际上可能没问题。
我希望这会有所帮助,或者至少指出你正确的方向。
答案 1 :(得分:1)
您可以在集合映射中添加“where”子句。查看参考文档。
答案 2 :(得分:1)
我会将OdometerReading属性映射为一个组件,然后使用命名查询来确保它填充了数据库的最新读数。 (在这个例子中,你有一个名为“vehicle”的sql查询,它使SQL加载Vehicle列以及最新的里程表读数)
<class name="Vehicle">
<property name="Type" not-null="true"/>
<component name="OdometerReading">
<property name="Miles" />
<property name="Date" />
</component>
<loader query-ref="vehicle"/>
</class>