2011-11-12 39 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:我明白你的意思了。长话短说;这是不可能的。看我的编辑给你一些想法如何克服这个问题。 –