10

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

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

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

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

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

所有导航和集合属性都是虚拟的。例如:

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

此外,所有表都这样初始化:

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

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

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

4

2 回答 2

5

我该如何进一步诊断?

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

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

Entity entity = context.Entities.Create();

entity将是一个代理,但NavigationName并且CollectionName将是,即使您访问这些属性(导致s)null,它们也会保留。这只会在您附加实体时发生变化:nullNullReferenceException

context.Entities.Attach(entity);

如果您现在访问属性,则应该运行延迟加载。如果数据库中没有相关实体,NavigationName 可以保留,但集合不应该在附加和访问它之后。如果数据库中没有相关实体,则结果应该是一个空集合,但不是.nullCollectionNamenullnull

于 2013-04-22T18:06:12.500 回答
0

您需要使用模型构建器定义实体之间的关系:http: //blogs.msdn.com/b/aspnetue/archive/2011/05/04/entity-framework-code-first-tutorial-supplement-what-is-going -on-in-a-fluent-api-call.aspx

于 2013-04-22T17:26:58.787 回答