2016-11-21 151 views
1
public virtual Student Student {get; set;} 

爲什麼外鍵約束需要標記爲虛擬?我看過虛擬和虛擬虛擬的例子。有關係嗎?爲什麼EF Code First中的外鍵標記爲虛擬?

+1

可能重複[虛擬關鍵字可以在Entity Framework 4.1 POCO代碼優先?](http:// stackoverflow。com/questions/5597760/what-effects-can-the-virtual-keyword-have-in-entity-framework-4-1-poco-code-fi) – Shoe

回答

1

通過查看此:https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx以及@Shoes在評論中提供的鏈接。

我會這樣說:

1.如果你申報你的財產的虛擬:

你的虛擬財產(默認)將查詢的主要對象時,不會立即加載。只有嘗試訪問數據庫或訪問其中的某個組件時,它纔會從數據庫中進行檢索。

這就是所謂的延遲加載。

2.如果你聲明它非虛:

你的財產將(默認),可以用在您的主實體上所有的其他財產一起馬上加載。這意味着您的財產將準備好訪問:它已被撤回。因爲您訪問此屬性,實體將不必再次查詢數據庫。

這被稱爲熱切加載。

我的看法:

更多的時候我選擇熱切加載(非虛擬的),因爲大部分的時間,我需要每一個實體的每一個屬性,而不必查詢返回(在快一起使用如果你只是偶爾訪問這個屬性(你沒有列出任何東西),而且你希望更多的時候只是其餘的信息不用這個,那麼就讓它變成虛擬的,這樣這個屬性不會變慢查詢的其餘部分僅用於一些訪問。

希望這是明確的......

Exemples:

在哪裏,我不會使用虛擬(急切地):

foreach(var line in query) 
{ 
    var v = line.NotVirtual; // I access the property for every line 
} 

在那裏我會使用虛擬或延遲加載:

foreach(var line in query) 
{ 
    if(line.ID == 509)  // because of this condition 
     var v = line.Virtual; // I access the property only once in a while 
} 

最後一件事:

如果您不查詢1000行以上的數據庫,那麼無論您選擇什麼都不會有很大的影響。另外,你可以聲明這些虛擬財產,如果你想測試周圍的其他方式,你就必須做到這一點:

context.LazyLoadingEnabled = false; 

將取消虛擬效果。

+0

謝謝,那非常直截了當。 –