10

對於我所有的POCO,導航和收集屬性均爲空。代碼第一代自動代理類導航和收集屬性爲空

讓我提供一些背景知識。我有一個使用EF 4.3.1的複雜代碼第一個項目。代理生成已禁用。集合和導航屬性是手動管理的。

我現在啓用代理創建和延遲加載。在調試時,我可以看到我的實體(投射到我已知的POCO類型)現在實際上是一個自動生成的代理類。到現在爲止還挺好。

現在,當我查看我的導航屬性時,它們爲空。同樣,我的集合屬性爲空。

使用反射,我可以看到代理類HAS重寫了我的導航和集合屬性。

所有導航和收藏屬性都是虛擬的。 e.g:

public virtual NavigationType NavigationName { get; set; } 
public virtual ICollection<CollectionType> CollectionName { get; set; } 

此外,所有表被初始化爲這樣:

modelBuilder.Entity<TEntity>() 
.Map(m => 
{ 
    m.MapInheritedProperties(); 
    m.ToTable("TableName"); 
}); 

我也可以證實,按預期的方式生成的數據庫。外鍵都存在,並與預期的字段相關聯。

爲什麼它們是空的?我如何進一步診斷?

+0

偉大的問題。 – mattytommo 2013-04-22 15:44:20

+0

這些集合屬性在你的班級中被標記爲「虛擬」嗎? – alex 2013-04-22 15:45:44

+0

查看要求 - http://msdn.microsoft.com/en-gb/library/vstudio/dd468057(v=vs.100).aspx – devdigital 2013-04-22 15:47:12

回答

5

我怎樣才能進一步診斷呢?

您可以通過查看更改跟蹤器的context.ChangeTracker.Entries()集合來檢查您正在檢查的實體是否附加到上下文。

這是很可能的,你有一個動態代理了所有的導航性能是null,例如:

Entity entity = context.Entities.Create(); 

entity將是一個代理,但NavigationNameCollectionNamenull,他們將留null即使您訪問這些屬性(導致NullReferenceException s)。這隻會在您附加實體時發生變化:

context.Entities.Attach(entity); 

如果您現在訪問屬性,應該運行延遲加載。 NavigationName可以null如果在數據庫中沒有相關的實體,而是收集CollectionName連接和訪問之後不應該是null。如果DB中沒有相關實體,則結果應該是空集合,但不是null

+0

有趣。正如你所說,我正在採取的道路。它使用.Create(),但不要.Attach(..)實體,直到我準備提交。我現在要調查。 – 2013-04-22 18:07:41

+0

釘在頭上。我沒有實現首次創建實體的初始化。非常感謝! – 2013-04-22 19:27:59