我對this問題提出了後續問題。以編程方式忽略HasMany關係?
我使用Silverlight和WCF,其中lazyloading不是一個選項。如何在某些情況下以編程方式忽略HasMany關係提高性能? (我只想要沒有相關酒吧的Foo's)。
我對this問題提出了後續問題。以編程方式忽略HasMany關係?
我使用Silverlight和WCF,其中lazyloading不是一個選項。如何在某些情況下以編程方式忽略HasMany關係提高性能? (我只想要沒有相關酒吧的Foo's)。
基本上,你試圖做的事是不可能的,無論是NHibernate還是Fluent。你不能有映射說「有時加載,有時不是」。設置Not.LazyLoad()
幾乎是顯示停止 - NHibernate 將加載收集總是,完全。
這些類型的優化(有時加載,有時不是)更適合於在模型的DAO部分處理。例如,你可以有你的FooDao
類看起來像這樣:
public class FooDao
{
public IList<Foo> GetFoosEagerly()
{
// load all Foos first; then all Bars for every Foos
var foos = session.QueryOver<Foo>().List();
foreach (var foo in foos)
{
NHibernateUtil.Initialize(foo.Bars);
}
return foos;
}
public IList<Foo> GetFooPerformanceCritical()
{
return session.QueryOver<Foo>().List();
}
}
使用標準映射(如,不使用Not.LazyLoad()
),第一種方法將仍與酒吧集合完全集中返回FOOS(我們只需要告訴NHibernate現在加載它們,然後再返回)。但是,第二個將返回Foo
對象只有。沒有單一的Bar
將被加載。相反,NHibernate將爲每個Foo
代替Bars集合生成代理對象。
您的WCF服務可以在內部使用此類DAO對象。當然,您可以使用類似的方法來加載單個Foo。
結論很簡單;映射本身不會幫助你解決問題。你需要做一些額外的編碼工作,但它絕對有可能。
我並不完全明白。當我請求Foo's時,我自動獲取所有相關的Foo.Bars,因爲我有一個映射HasMany(x => x.Bars).Not.LazyLoad();在我的Foo映射文件中。是的,正如我寫的,我使用WCF服務。 – randoms
@randoms:我明白你的意思了。長話短說;這是不可能的。看我的編輯給你一些想法如何克服這個問題。 –