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