2010-02-23 107 views
0

我有兩個表 - Run和Sample,其中Sample.RunId是將樣本鏈接到其運行的外鍵。如何使用NHibernate映射SampleCount屬性

我想在Run中有一個SampleCount屬性,它是與特定Run相關的Sample對象的數量。

是否有可能在運行類型的NHibernate映射中映射這樣一個屬性?

謝謝。

回答

1

儘管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 ++功能),如果這個屬性是你很少需要的東西。

+1

好,我沒有公式引用當前的實體。 BTW,懶惰加載屬性是NH 3.x的新功能,所以如果你願意引用中繼版本,你現在只能使用它們。 – 2010-02-24 16:00:25

+0

聽起來不錯。我一定會試一試。 – mark 2010-02-24 19:09:44

+0

有趣的是,在2.1.2GA中映射驗證了財產懶惰雖然它沒有實際完成 – Jaguar 2010-02-25 08:26:04

1

雖然你可以使用<join>來做到這一點,但這不是一個好主意。

取而代之,將您的Run.Samples集合聲明爲lazy="extra",並且訪問Run.Samples.Count將執行計數查詢而不是加載整個集合。

+0

爲什麼是一個壞主意? – mark 2010-02-24 07:30:14

+0

更新時會產生問題,並且您還在每次運行訪問時加載額外數據。在這種情況下使用它是一種破解(不是我沒有做到這一點......) – 2010-02-24 11:55:00