代码第一个自动代理类导航和集合属性为null

时间:2013-04-22 15:40:34

标签: c# entity-framework c#-4.0 ef-code-first entity-framework-4.3

对于我的所有POCO,导航和集合属性都为空。

让我提供一些背景知识。我有一个使用EF 4.3.1的复杂代码第一个项目。代理生成已禁用。手动管理集合和导航属性。

我现在正在启用代理创建和延迟加载。在调试时,我可以看到我的实体(转换为我已知的POCO类型)现在实际上是一个自动生成的代理类。到现在为止还挺好。

现在,当我查看导航属性时,它们为空。同样,我的集合属性为null。

使用反射,我可以看到代理类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");
});

我还可以确认数据库是按预期生成的。外键都存在并与预期字段相关联。

为什么他们是空的?我该如何进一步诊断?

2 个答案:

答案 0 :(得分:5)

  

如何进一步诊断?

例如,您可以通过查看更改跟踪器的context.ChangeTracker.Entries()集合来检查您正在检查的实体是否附加到上下文。

您可以拥有一个动态代理,其所有导航属性都为null,例如:

Entity entity = context.Entities.Create();

entity将成为代理,但NavigationNameCollectionName将为null,即使您访问这些属性,它们也将保持null(导致NullReferenceException S)。这只会在您附加实体时发生变化:

context.Entities.Attach(entity);

如果您现在访问属性,则应运行延迟加载。如果数据库中没有相关实体,NavigationName 可以保留null,但在附加和访问后,集合CollectionName永远不应该是null 。如果数据库中没有相关实体,则结果应为空集合,而不是null

答案 1 :(得分:0)