簡體   English   中英

流利的NHibernate +禁用LazyLoad

[英]Fluent NHibernate + Disable LazyLoad

嘿那里,我試圖在沒有運氣的情況下禁用我的收藏品上的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");
    }
}

有什么建議么?

提前致謝!

延遲加載意味着只有在您訪問汽車屬性時才會加載汽車收藏。 因此,當您關閉此功能時,在裝載一個人時,您將始終加載所有他的車。 要查看這是否“有效”,您可以打開SQL profiler(或獲取NHibernate Profiler的試用版),並調試代碼。 當您單步執行代碼時,您可以看到汽車集合是立即加載,還是僅在您第一次訪問它時。

簡而言之,我不認為你做錯了什么,只是誤解了這個概念。

如果您使用的是Load方法,請嘗試使用Get Load總是返回一個代理並且懶洋洋地加載iirc。 但要注意SELECT N + 1。

編輯 :重新閱讀其他評論后,它可能會按預期工作。 Doron已經解釋了延遲裝載應該如何工作。 因此,如果您不想將所有車輛與一個人一起加載,則應啟用延遲加載。 默認情況下已啟用延遲加載,因為如果您急切地加載所有集合,則會產生SELECT N + 1,如前所述。 也就是說,一個選擇人,N選擇汽車。 這種行為通常是不可取的,因此我的警告:)延遲加載意味着只有在明確要求時才會加載集合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM