[英]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.