[英]EF6 - Lazy loading related entity always null
由于某种原因,相关实体的延迟加载总是变成NULL。我认为我遵循了所有需要的规则来申请代理生成,但是我似乎无法解决这个问题。
我有一个 object tblOrder_Procedure,它有一个 tblRoom 和一个 tblProcedure。 由于某种原因,tblProcedure 总是自动加载,但 tblRoom 不会。 然而 FK 在那里,但相关的实体只是没有加载。
所有类都有公共无参数构造函数。
这些是字段定义:
public int? Procedure_UID { get; set; }
public int? Room_UID { get; set; }
public virtual tblRoom tblRoom { get; set; }
public virtual tblProcedure tblProcedure { get; set; }
我不使用注释,而是使用流利的上下文的 OnModelCreating 方法 API。FK 是这样完成的:
modelBuilder.Entity<tblRoom>()
.HasMany(e => e.tblOrder_Procedure)
.WithOptional(e => e.tblRoom)
.HasForeignKey(e => e.Room_UID);
modelBuilder.Entity<tblProcedure>()
.HasMany(e => e.tblOrder_Procedure)
.WithOptional(e => e.tblProcedure)
.HasForeignKey(e => e.Procedure_UID);
ProxyCreationEnabled 和 LazyLoadingEnabled 默认情况下都为真。
我错过了什么?
我会写下两种最有可能的可能性。
-也许您正在某处显式使用 .AsNoTracking() 扩展名或被您编写的另一个助手隐藏。
- 你可以尝试添加optionsBuilder.UseLazyLoadingProxies(); 到 Context.OnConfiguring(DbContextOptionsBuilder optionsBuilder)。
我想出了问题是什么。 它有两个起源:
我正在使用新创建并插入数据库的 object 来尝试使用延迟加载。 事实证明,您随后需要使用 .Create() 而不是“new”来创建 object。
原来我使用的是一个寿命太长的数据库上下文。 在出现问题之前的某个地方,tblProcedure object 已经加载到上下文缓存中,因此可以解决外键关系。 这让它看起来像是延迟加载,但实际上不是。
afaik,如果您使用虚拟关键字,则应使用“include”方法。
modelBuilder.Entity<tblRoom>()
.Include(f=>f.tbl_room)
.HasMany(e => e.tblOrder_Procedure)
.WithOptional(e => e.tblRoom),
.HasForeignKey(e => e.Room_UID);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.