2014-03-30 21 views
5

這是我的理解是,如果我想在我的EF6應用程序中使用延遲加載,我應該 這樣的代碼我的人際關係與最後兩個項目標記爲虛擬:如果我將懶加載設置爲false(現在),那麼,如果我包含「虛擬」關鍵字還是將它保留出去,那麼這很重要嗎?

public class Test 
{ 
    public int TestId { get; set; } 
    public int ExamId { get; set; } 
    public string Title { get; set; } 
    public int Status { get; set; } 
    public System.DateTime CreatedDate { get; set; } 
    public virtual Exam Exam { get; set; } 
    public virtual ICollection<UserTest> UserTests { get; set; } 
} 

如果我不想使用延遲加載(目前),如果我將lazyloading配置設置爲false,那麼如果我留在virtual關鍵字中還是有任何性能方面的考慮,或者我應該像這樣編寫我的類沒有關鍵字?

public class Test 
{ 
    public int TestId { get; set; } 
    public int ExamId { get; set; } 
    public string Title { get; set; } 
    public int Status { get; set; } 
    public System.DateTime CreatedDate { get; set; } 
    public Exam Exam { get; set; } 
    public ICollection<UserTest> UserTests { get; set; } 
} 

的原因,我問這是我想通過在virtual關鍵字保持,但是當我不使用延遲加載只有不會引起任何問題,對我來說,保持靈活性。

我閱讀下列

「如果你使用虛擬關鍵字上ICollection的/一個一對多的關係屬性,它會延遲加載默認情況下,而如果你離開虛擬關鍵字出,它會被急切加載。「

即使我設置了DbContext.Configuration.LazyLoadingEnabled = false;,這是否正確?

+0

如果你設置它,然後立即加載會做。和虛擬關鍵字意味着不同的,我認爲 –

+0

你是什麼意思「如果你把它」? – Melina

+0

如果設置lazyloadingenabled假 –

回答

4

virtual關鍵字只是使得能夠派生類可以在運行時動態創建它覆蓋在順序標記爲virtual屬性注入一些數據訪問代碼(「代理」)。但是,當你設置LazyLoadingEnabled = false你告訴實體框架「不要忽略我的實體類與延遲加載代理」。在這種情況下,virtual關鍵字不起任何作用。 (嗯,我不能真正告訴什麼是實例化具有virtual性質或.NET CLR觀點方法的對象的成本,可能還存在一些費用,但我敢肯定比實際訪問數據庫是幾乎沒有。 )

所以,你的做法特性標記爲virtual是開放的可能延遲加載的,以後在我看來罰款。

順便說一句:這 - 而如果你離開虛擬關鍵字,它將被急切加載 - 是錯誤的。如果禁用延遲加載 - 要麼通過省略virtual關鍵字或通過設置LazyLoadingEnable = false - 你沒有得到默認情況下,預先加載。相反,你根本沒有加載(導航屬性)。預先加載必須明確使用Include或使用預測編碼。

就更不用說了:你也可以添加virtual後來修改當你需要它。你可以限制它到特定的實體。 EF不認爲這是一種模型變化,它會以某種方式觸及數據庫模式。

2

當您設置LazyLoadingEnabled = False。它不會影響到延遲加載,即使您包含虛擬關鍵字。

虛擬DbContext.Configuration兩個屬性一起工作:

  • ProxyCreationEnabled

[MSDN]獲取或設置一個值,指示框架是否會 創建的動態實例每當它 創建的實體類型的實例生成的代理類

  • LazyLoadingEnabled
相關問題