代码首先自动生成代理类导航和集合属性为空

本文关键字:集合 属性 导航 自动生成 代理 代码 | 更新日期: 2023-09-27 18:10:16

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

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

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

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

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

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

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

同样,所有表都是这样初始化的:

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

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

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

代码首先自动生成代理类导航和集合属性为空

如何进一步诊断?

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

很可能你有一个动态代理,所有导航属性都是null,例如:

Entity entity = context.Entities.Create();

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

context.Entities.Attach(entity);

如果你现在访问属性,延迟加载应该运行。如果数据库中没有相关的实体,NavigationName 可以保持null,但是集合CollectionName在附加和访问之后永远不能是null。如果DB中没有相关的实体,结果应该是一个空集合,但不是null

你需要使用modelbuilder定义实体之间的关系: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

相关文章: