2011-11-12 35 views
0

我對this問題提出了後續問題。以編程方式忽略HasMany關係?

我使用Silverlight和WCF,其中lazyloading不是一個選項。如何在某些情況下以編程方式忽略HasMany關係提高性能? (我只想要沒有相關酒吧的Foo's)。

回答

1

基本上,你試圖做的事是不可能的,無論是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。

結論很簡單;映射本身不會幫助你解決問題。你需要做一些額外的編碼工作,但它絕對有可能。

+0

我並不完全明白。當我請求Foo's時,我自動獲取所有相關的Foo.Bars,因爲我有一個映射HasMany(x => x.Bars).Not.LazyLoad();在我的Foo映射文件中。是的,正如我寫的,我使用WCF服務。 – randoms

+0

@randoms:我明白你的意思了。長話短說;這是不可能的。看我的編輯給你一些想法如何克服這個問題。 –