2013-03-06 23 views
0

我是新來的實體框架,想知道爲什麼我的外鍵屬性(S)必須是「虛擬」即使數據可以加載沒有非虛擬外鍵。是否對使用POCO的外鍵使用虛擬類型?

可以說我有兩個班。兩者都有虛線關鍵字註釋掉。數據仍然會被加載而沒有虛擬。那麼爲什麼我們必須使用虛擬?一旦我們使用Context.SaveChanges()添加/更新/刪除記錄,它會產生影響嗎?

public class Application 
{ 
    public int ApplicationID{get;set;} 
    public string Name{get;set;} 

    //public virtual ICollection<ApplicationPages> Pages{get;set;} 
    public ICollection<ApplicationPages> Pages{get;set;} 
} 

public class ApplicationPages 
{ 
    public int ApplicationPageID{get;set;} 
    public string Name{get;set;} 

    public int ApplicationID{get;set;} 
    [ForeignKey("ApplicationID")] 
    public Application Application{get;set;} 
    //public virtual Application Application{get;set;} 
} 

回答

1

據我瞭解,虛擬關鍵字是必需的,允許實體框架,使您的班,這有助於延遲加載情況下的代理。

我不知道代理變種的細節,但我猜它帶回,並與母店子ID。然後,它隨後訪問子屬性(除id以外),它有一種有效的方法來獲取子記錄。

我曾與父導航性能故障,並留出來贊成在必要時明確加載子記錄。但是,我的密鑰是兩部分(id和生效日期),這可能是原因。

+0

非常感謝您的回覆。其實,我問這個問題的原因是,我正在使用的應用程序是使用實體框架4.3,我已禁用延遲加載和使用延遲加載。我的類有導航屬性,但它們不是創建爲「虛擬」。一切工作正常,但更新功能給我很難。每當我更新一個父行,子行得到重複。所以我想知道也許是因爲我沒有使用虛擬作爲關鍵字實體框架我的上下文的鬆散軌道,並認爲在子對象中有所改變,並將它們作爲新行插入。 – Tauseef 2013-03-06 16:58:36

+1

是的,我相信虛擬標籤也用於解析對象圖中的FK關係,這可能會解釋重複 - 聽起來像EF沒有在您的Pages集合中看到更新的項目,因此它會插入它們。請參見此網址的幻燈片6 http://www.slideshare.net/JulieLerman/persistence-ignorance-in-entity-framework-4-julie-lerman,顯示代理參與檢測更改。關鍵是,如果你不使用虛擬,你將不會得到一個代理類。這是一個相當複雜的領域,請搜索Julie Lerman的博客以獲得更好的解釋,或查看她的書籍。 – Ackroydd 2013-03-06 19:47:51

+0

感謝您的回覆,並指出我正確的方向。 – Tauseef 2013-03-07 13:26:13

相關問題