我有兩個表 - Run和Sample,其中Sample.RunId是將樣本鏈接到其運行的外鍵。如何使用NHibernate映射SampleCount屬性
我想在Run中有一個SampleCount屬性,它是與特定Run相關的Sample對象的數量。
是否有可能在運行類型的NHibernate映射中映射這樣一個屬性?
謝謝。
我有兩個表 - Run和Sample,其中Sample.RunId是將樣本鏈接到其運行的外鍵。如何使用NHibernate映射SampleCount屬性
我想在Run中有一個SampleCount屬性,它是與特定Run相關的Sample對象的數量。
是否有可能在運行類型的NHibernate映射中映射這樣一個屬性?
謝謝。
儘管Diego Mijelshon的收集解決方案非常有效,但它在獲取Run
實體後確實意味着額外的查詢。如果您尚未將收集和你不希望或不希望額外的查詢,考慮在Run
類映射
<property name="SamplesCount" type="long" formula="(select count(s.Id) from Samples s where s.RunId = Id)" />
,並在一個「計算」財產等
類Run
只需添加
long SamplesCount {get; set;}
注意的是,在查詢中,部分「s.RunId = ID」的NHibernate將插入根表正確的別名。此外,不要忘記括號,它使解析器更容易,並且在某些情況下是必需的。
這種方法的好處是在select上應用子查詢(根據您的情況可能會不一樣)。該屬性也可以是懶惰加載的(我認爲是NH 2 ++功能),如果這個屬性是你很少需要的東西。
雖然你可以使用<join>
來做到這一點,但這不是一個好主意。
取而代之,將您的Run.Samples
集合聲明爲lazy="extra"
,並且訪問Run.Samples.Count
將執行計數查詢而不是加載整個集合。
爲什麼
好,我沒有公式引用當前的實體。 BTW,懶惰加載屬性是NH 3.x的新功能,所以如果你願意引用中繼版本,你現在只能使用它們。 – 2010-02-24 16:00:25
聽起來不錯。我一定會試一試。 – mark 2010-02-24 19:09:44
有趣的是,在2.1.2GA中映射驗證了財產懶惰雖然它沒有實際完成 – Jaguar 2010-02-25 08:26:04