代码首先自动生成代理类导航和集合属性为空
本文关键字:集合 属性 导航 自动生成 代理 代码 | 更新日期: 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
将是一个代理,但NavigationName
和CollectionName
将是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