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