2009-06-03 211 views
1

最新的入门比方说,我的域名看起来是这样的:属性映射到NHibernate的

  • 我有一个对象,车管所,有一个OdometerReading属性。
  • 里程表读数有里程&日期(当它被读取时)。

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

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

NHibernate有可能吗?我将如何映射这样的事情?

回答

1

有几种方法可以做到这一点,取决于你想要你的域模型的样子。我最喜欢的选择是使用自定义集合类型,例如IOdometerReadingCollection,您可以添加额外的方法。在这种情况下,它可能是这样的:

public interface IOdometerReadingCollection : IList<OdometerReading> 
{ 
    OdometerReading Latest { get; } 
} 

这样,你可以这样做:

OdometerReading reading = vehicle.OdometerReadings.Latest; 

我宁愿:

OdometerReading reading = vehicle.LatestOdometerReading; 

有大量的文件有关自定义集合,其中你可以找到一个简单的谷歌搜索。

如果这种方法不适合你,还有其他选择。您可能能够使用带有公式的属性(我不确定它是否适用于复杂类型?),或者定期使用NHibernate关联,您可以在车辆映射中使用最新的OdometerReading关键字。正如你也提到你可以加载所有的OdometerReadings,这取决于你的用例可能实际上是好的。

我希望这会有所帮助,或者至少让您指向正确的方向。

+0

谢谢,jonnii。这仍然会给我带来一系列OdometerReadings。我想要在那里有一辆单独的OdometerReading。有没有办法只有一个OdometerReading,并且它是最新的? – 2009-06-05 18:29:19

+0

通过这种方式,您可以访问所有的里程表读数,如果您想要它们并能够获取最新的读数。如果你只想要最新的一个,你最好使用什么外延建议(一个where子句)。 – jonnii 2009-06-05 21:13:22

1

有一个“where”子句可以放在您的集合映射中。检查参考文件。

1

我会将OdometerReading属性映射为一个组件,然后使用命名查询来确保它填充了最新的数据库读取。 (在这个例子中,你将有一个名为“车辆”的SQL查询,该SQL用于加载车辆列以及最新的里程计读数)

<class name="Vehicle"> 
    <property name="Type" not-null="true"/> 
    <component name="OdometerReading"> 
     <property name="Miles" /> 
     <property name="Date" /> 
    </component> 
    <loader query-ref="vehicle"/> 
</class>