2014-02-21 39 views
2

我有一個具有自我關係的實體模型(父/子)。我的名爲Article的實體有一個名爲parent的屬性。這個父母實際上是關係,ParentID是關係中的字段。在EF 4我這樣做:實體框架更新更改

using (var dbContext= new DataBaseModel()) 
{ 
    ArticleTable newEntity= new ArticleTable(); 
    newEntity.name="childArt"; 
    newEntity.ParentID = 1; 
    dbContext.ArticleTable.Add(newEntity); 
    dbContext.SaveChanges(); 

    //after calling save I can do this 
    var parentName = newEntity.Parent.Name; 
} 

實體框架6,這不工作了,我爲了得到相關的父實體再次從數據庫中獲取的實體。這是因爲懶惰加載的變化?我應該做什麼不同。

回答

3

不同之處在於,在EF 4中,實體是通過一堆代碼來生成的,這些代碼負責處理更改通知和延遲加載。此後,帶有POCO的DbContext API已成爲標準。

如果你想相同的行爲與舊的「富」的實體,您必須確保延遲加載可以通過一些條件發生:

  • 上下文必須允許延遲加載。它默認是這樣做的,但你可以關閉它。
  • 您希望延遲加載的導航屬性必須具有virtual修飾符,因爲
  • EF必須創建動態代理。這些代理有點類似於舊生成的實體,因爲它們可以執行延遲加載,因爲它們會覆蓋原始類的虛擬成員。

最後(也許是第二個)點可能是您唯一需要注意的地方。如果您通過new創建一個新對象,它只是一個無法進行延遲加載的POCO對象。但是,如果您要創建代理,則會發生延遲加載。幸運的是,有一個簡單的方法來創建一個代理:

ArticleTable newEntity= dbContext.ArticleTables.Create(); 

DbSet<T>.Create()將創建動態代理 -

如果底層的背景下被配置爲創建代理和實體類型符合創建代理的要求。