将属性映射到NHibernate中的最新条目

时间:2009-06-03 18:50:53

标签: nhibernate nhibernate-mapping

假设我的域名如下:

  • 我有一个具有OdometerReading属性的对象Vehicle。
  • 里程表读数有Miles&日期(读取时)。

我需要保留数据库中车辆的所有OdometerReadings的历史记录,但不希望整个里程表历史记录属于Vehicle对象。我想要的是OdometerReading属性映射到数据库中最新的OdometerReading条目。

我想过将OdometerReadings的整个集合映射到Vehicle,并且有一个名为CurrentOdometerReading的动态属性可以对它们进行排序并返回最新的属性,但我不需要在我的域中的Vehicle下的整个集合,并且好像我会从数据库中获取比我需要的更多的数据。

NHibernate可以吗?我如何绘制这样的东西?

3 个答案:

答案 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>