2016-07-07 108 views
0

我再次有以下兩類,由我的測試模型產生:延遲加載不起作用

public partial class House 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public House() 
    { 
     this.Persons = new HashSet<Person>(); 
    } 

    public int id { get; set; } 
    public string street { get; set; } 
    public string city { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Person> Persons { get; set; } 
} 


public partial class Person 
{ 
    public int id { get; set; } 
    public string namen { get; set; } 
    public int house { get; set; } 

    public virtual House House1 { get; set; } 
} 

在我的DbContext的構造函數中我明確地啓用延遲加載,什麼甚至不應該必要:

 this.Configuration.LazyLoadingEnabled = true; 
     this.Configuration.ProxyCreationEnabled = true; 

後來我把房子的列表:

 YardEntities cx = new YardEntities(); 
     IList<House> hl = cx.Houses.ToList<House>(); 
     House h = hl[0]; 
     ///**************BREAKPOINT*******************/// 
     Person g = h.Persons.First<Person>(); 
     output = g.namen; 

標記b之後我預計,由於延遲加載,所有與房屋有關的人都是而不是。我沒有訪問一個人,所以他們爲什麼要加載?但是它們被加載,因爲我的調試器顯示了所有的名稱屬性。

有人可以解釋這種行爲嗎?爲什麼懶加載不起作用?

+0

我想因爲你用的是.. cx.Houses.ToList ();不要做toList(),你會得到數據 – lordkain

+0

不 - 這是官方教程,它也使用tolist()http://www.entityframeworktutorial.net/EntityFramework4.3/lazy-loading-with-dbcontext .aspx – David

+0

來幽默我,嘗試沒有tolist – lordkain

回答

3

我沒有訪問一個人,所以他們爲什麼要加載?

你說得對。延遲加載不會加載任何關係,除非您想要訪問他們。

然而,他們被加載,因爲我的調試器顯示我所有的名稱屬性。

那麼這裏實際上你調試訪問他們,所以延遲加載會做的工作,並從數據庫中獲取它們。

+0

ah okay。好吧,如果那是真的,我很好。 – David

+0

是的,這是真的。如果你想確認延遲加載是否按預期工作,請嘗試[記錄數據庫操作](https://msdn.microsoft.com/zh-cn/library/default.aspx)。 com/en-us/data/dn469464.aspx),而不是確認該關係僅在第一次訪問時被加載(查詢) – sstan

+0

好吧,我試過了,我可以驗證它是100%真實的。 。 – David

0

如果我不使用tolist():

 DbSet<House> hl = cx.Houses; 
     House h = hl.FirstOrDefault<House>(); 

H內的所有人員,即使延遲加載啓用。我想阿文斯的答案一定是真的。調試器在我想看到它們時加載所有的值。 但是有沒有辦法來證明他的猜測?