对于我的所有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");
});
我还可以确认数据库是按预期生成的。外键都存在并与预期字段相关联。
为什么他们是空的?我该如何进一步诊断?
答案 0 :(得分:5)
如何进一步诊断?
例如,您可以通过查看更改跟踪器的context.ChangeTracker.Entries()
集合来检查您正在检查的实体是否附加到上下文。
您可以拥有一个动态代理,其所有导航属性都为null
,例如:
Entity entity = context.Entities.Create();
entity
将成为代理,但NavigationName
和CollectionName
将为null
,即使您访问这些属性,它们也将保持null
(导致NullReferenceException
S)。这只会在您附加实体时发生变化:
context.Entities.Attach(entity);
如果您现在访问属性,则应运行延迟加载。如果数据库中没有相关实体,NavigationName
可以保留null
,但在附加和访问后,集合CollectionName
永远不应该是null
。如果数据库中没有相关实体,则结果应为空集合,而不是null
。
答案 1 :(得分:0)