Nhibernate 以编程方式忽略多个关系?

Nhibernate 以编程方式忽略多个关系?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我还有一个问题要问 我使用Silverlight和WCF,其中懒散加载不是一个选项。在某些情况下,如何以编程方式忽略HasMany关系以提高性能?(我只想要没有相关条的Foo)。基本上,你想要做的是不可能的,无论是NHibernate还是Fluent。您不能让映射说“有时加载,有时不加载”。设置Not.LazyLoad()非常show stopper-NHibernate将始终完全加载集合 这种优化(有时加载,有时不加载)更适合在模型的一部分进行处理。例如,您的FooDao类可以如下所示: pu

我还有一个问题要问


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

基本上,你想要做的是不可能的,无论是NHibernate还是Fluent。您不能让映射说“有时加载,有时不加载”。设置
Not.LazyLoad()
非常show stopper-NHibernate将始终完全加载集合

这种优化(有时加载,有时不加载)更适合在模型的一部分进行处理。例如,您的
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();
    }
}
公共类FooDao
{
公共IList GetFoosEagerly()
{
//首先加载所有foo;然后加载每个foo的所有条
var foos=session.QueryOver().List();
foreach(foos中的var foo)
{
NHibernateUtil.Initialize(foo.bar);
}
返回foos;
}
公共IList GetFooPerformanceCritical()
{
return session.QueryOver().List();
}
}
使用标准映射(如使用
not.LazyLoad()
not),第一个方法仍然会返回完全设置了Bars集合的Foos(在返回之前,我们只需要告诉NHibernate立即加载它们)。但是,第二个tho将仅返回
Foo
对象。不会加载单个
。相反,NHibernate将为每个
Foo
生成代理对象,以代替Bars集合

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


结论简单;映射本身无法帮助您解决问题。您需要做一些额外的编码工作,但这绝对是可能的。

我不太明白。当我请求Foo时,我会自动获取所有相关的Foo.bar,因为我有一个映射有很多(x=>x.bar).Not.LazyLoad();在我的Foo映射文件中。是的,正如我写的,我使用WCF服务。@randoms:我明白你的意思。长话短说;这是不可能的。请参阅我的编辑,了解如何克服此问题。