繁体   English   中英

EF6 - 延迟加载相关实体始终 null

[英]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)。

我想出了问题是什么。 它有两个起源:

  1. 我正在使用新创建并插入数据库的 object 来尝试使用延迟加载。 事实证明,您随后需要使用 .Create() 而不是“new”来创建 object。

  2. 原来我使用的是一个寿命太长的数据库上下文。 在出现问题之前的某个地方,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM