以编程方式忽略HasMany关系?

时间:2011-11-12 22:00:27

标签: nhibernate fluent-nhibernate

我向this问题提出了跟进问题。

我使用Silverlight和WCF,其中懒惰加载不是一个选项。如何在某些情况下以编程方式忽略HasMany关系以提高性能? (我只想要没有相关栏的Foo)。

1 个答案:

答案 0 :(得分: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()),第一种方法仍将返回完全设置Bars集合的Foos(我们只需要告诉NHibernate现在加载它们,之前我们回来)。但是,第二个将仅返回Foo个对象 。不会加载单Bar。相反,NHibernate会为每个Foo生成代理对象来代替Bars集合。

您的WCF服务可以在内部使用此类DAO对象。当然,您可以使用类似的方法来加载单个Foo。

结论很简单;单独的映射不会帮助您解决问题。你需要做一些额外的编码工作,但这绝对是可能的。