Code First自动生成代理类,导航属性和集合属性为空。

10

我所有的POCO对象中,导航属性和集合属性都为null。

让我提供一些背景。我的项目使用EF 4.3.1,并且禁用了代理生成。手动管理集合和导航属性。

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

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

使用反射,我可以看到代理类覆盖了我的导航和集合属性。

所有导航和集合属性都是virtual的,例如:

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

另外,所有表都被初始化为以下内容:

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

我也可以确认数据库已按预期生成。外键全部存在,并与预期字段相关联。

为什么它们为空?我如何进一步诊断这个问题?


请查看以下要求 - http://msdn.microsoft.com/zh-cn/library/vstudio/dd468057(v=vs.100).aspx - devdigital
@alex 是的,它们是虚拟的。 - Paul Fleming
@devdigital 我的设置符合所有要求。 - Paul Fleming
你实际上在哪里使用流畅的API或其他方式定义关系? - devdigital
你能展示一下你的查询代码、上下文等吗? - devdigital
显示剩余3条评论
2个回答

5

我该如何进一步诊断?

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

很可能您有一个动态代理,其中所有导航属性均为null,例如:

Entity entity = context.Entities.Create();

entity将是一个代理对象,但NavigationNameCollectionName将为null,并且即使您访问这些属性,它们也将保持为null(导致NullReferenceException)。只有在您附加实体时,这种情况才会改变:

context.Entities.Attach(entity);

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

有趣。我采取的路径就像你所说的那样。它使用 .Create() 但在我准备提交之前不会 .Attach(..) 实体。我现在会进行调查。 - Paul Fleming
说得一针见血。我还没有为实体第一次创建时实现初始化。非常感谢! - Paul Fleming


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接