流利NHibernate + 禁用延迟加载

3
嘿,我试图在我的集合中禁用LazyLoad,但没有成功... 到目前为止,我尝试过的代码是:
// Person.cs
public class Person
{
    public virtual int Id { get; private set; }
    public virtual string FirstName { get; set; }
    public virtual IList<Car> Cars { get; set; }

    public Person()
    {
        Cars = new List<Car>();
    }

    public virtual void AddCar(Car car)
    {
        Cars.Add(car);
    }
}

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id);
        Map(x => x.FirstName);
        HasMany(x => x.Cars).KeyColumn("PersonId").Cascade.AllDeleteOrphan().Not.LazyLoad();
        Table("Persons");
    }
}

// Car.cs

public class Car
{
    public virtual int Id { get; set; }
    public virtual string CarName { get; set; }
    public virtual Person Person { get; set; }
}

public class CarMap : ClassMap<Car>
{
    public CarMap()
    {
        Id(x => x.Id);
        Map(x => x.CarName);
        HasOne(x => x.Person).Not.LazyLoad();
        Table("Cars");
    }
}

有什么建议吗?

提前感谢!


1
那你怎么知道它不起作用了? - Diego Mijelshon
@Diego Mijelshon - 我已经在我的MVC应用程序中进行了测试,它仍然获取Person的Car对象。 :) - ebb
这就是你告诉它要做的事情。Not.LazyLoad() 的意思是“始终加载所有内容”,这通常不是一个好主意。 - Diego Mijelshon
2个回答

7
懒加载意味着只有在访问汽车属性时才会加载汽车集合。因此,当关闭此选项时,在加载人员时您将始终加载所有汽车。为了确定这是否适用于您,您可以打开SQL分析器(或获取NHibernate分析器的试用版),并调试您的代码。当您逐步执行代码时,您可以看到汽车集合是立即加载还是仅在首次访问它时加载。
简而言之,我认为您没有做错什么,只是误解了概念。

可能是...那么我如何获取一个人对象,而不包含与该人相关的所有汽车对象呢? - ebb
通过保持默认设置,即懒惰模式。 - Diego Mijelshon
@Diego Mijelshon - 嗯...不知道为什么懒加载被称为邪恶..我一直以为懒加载意味着它会为一个实体加载所有相关的实体。@Doron Yaacoby,你是对的..NHibernate分析器实际上捕获了2个SQL语句..一个用于获取Person对象,另一个用于获取与该Person相关的Car对象。 - ebb
1
@ebb 惰性加载的意思是相反的。只有那些不懂如何使用它的人才会把它称为“恶魔”。 - Diego Mijelshon
@ebb,实际上急切加载才是那个魔鬼。只要你的会话保持打开状态,懒加载就非常好用和迷人 :) - Patko
显示剩余2条评论

1

如果你正在使用Load方法,请尝试使用GetLoad总是返回代理并进行懒加载。注意选择SELECT N+1的问题。

编辑:在重新阅读其他评论后,它可能按预期工作。 Doron已经解释了惰性加载应该如何工作。因此,如果您不想一起加载所有汽车和人,则应启用惰性加载。默认情况下已启用惰性加载,因为如果您急切地加载所有集合,则会导致SELECT N+1,如前所述。也就是说,一个查询是针对人员,N个查询是针对汽车。通常不希望出现这种行为,因此我的警告:)惰性加载意味着仅在显式要求时才会加载集合。


你使用的是哪个FluentNH版本?似乎HasMany和Not存在问题,请参见http://support.fluentnhibernate.org/discussions/help/251-problem-setting-notlazyload-on-onetomanycollectioninstance。 - Patko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接