public virtual Student Student {get; set;}
爲什麼外鍵約束需要標記爲虛擬?我看過虛擬和虛擬虛擬的例子。有關係嗎?爲什麼EF Code First中的外鍵標記爲虛擬?
public virtual Student Student {get; set;}
爲什麼外鍵約束需要標記爲虛擬?我看過虛擬和虛擬虛擬的例子。有關係嗎?爲什麼EF Code First中的外鍵標記爲虛擬?
通過查看此: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;
將取消虛擬效果。
謝謝,那非常直截了當。 –
可能重複[虛擬關鍵字可以在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