2009-06-03 161 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>