我向this问题提出了跟进问题。
我使用Silverlight和WCF,其中懒惰加载不是一个选项。如何在某些情况下以编程方式忽略HasMany关系以提高性能? (我只想要没有相关栏的Foo)。
答案 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。
结论很简单;单独的映射不会帮助您解决问题。你需要做一些额外的编码工作,但这绝对是可能的。