EF Core 延迟加载代理随机返回 null 而不是实体

Ily*_*zus 5 .net c# entity-framework entity-framework-core asp.net-core-3.1

我有一个带有 SQL 数据库的 .Net Core 3.1 应用程序。我使用延迟加载代理从相关表中自动检索数据。基本上,我有一个表,它通过 1 对多或 1 对 1 关系引用其他一些实体。事情是,在大多数情况下,每个关系都可以,每个实体都被加载,我可以读取它的属性(例如名称字段)。

但是,在非常特殊的情况下,这些实体不会加载,尽管关系 Id 存在。它看起来像这样:

模型是这样的:

public partial class Delegation
{
    public Guid Id { get; set; }
    public int UserFrom { get; set; }
    public int UserTo { get; set; }

    public virtual User UserFromNavigation { get; set; }
    public virtual User UserToNavigation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在数据库上下文中初始化:

public virtual DbSet<Delegation> Delegations { get; set; }
...
modelBuilder.Entity<Delegation>(entity =>
{
    entity.Property(e => e.Id).ValueGeneratedNever();

    entity.HasOne(d => d.UserFromNavigation)
        .WithMany(p => p.DelegationsUserFromNavigation)
        .HasForeignKey(d => d.UserFrom)
        .OnDelete(DeleteBehavior.ClientSetNull)
        .HasConstraintName("FK_Delegations_Users_From");

     entity.HasOne(d => d.UserToNavigation)
        .WithMany(p => p.DelegationsUserToNavigation)
        .HasForeignKey(d => d.UserTo)
        .OnDelete(DeleteBehavior.ClientSetNull)
        .HasConstraintName("FK_Delegations_Users_To");
});
Run Code Online (Sandbox Code Playgroud)

这个具体的例子只是其中的一个,在其他模型中也没有加载其他实体的虚拟 ICollections。

在这里,在调试屏幕截图上,UserTo 是可以的,但 UserFrom 是 NULL。

UserTo 没问题,但 UserFrom 为 NULL

通过 Id 手动搜索实体并检索它的属性是有效的,但它会使代码变得更脏。

有什么方法可以强制 EF 加载那些丢失的实体,还是我在这里做错了?这种行为看起来非常随机。

小智 1

确保为 DbContext 启用延迟加载。在 Entity Framework Core 中,默认情况下不启用延迟加载,您需要在 Startup 文件或 OnConfiguring 方法中显式启用它。

optionsBuilder.UseLazyLoadingProxies();
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 Include 方法在查询数据时显式加载导航属性,而不是依赖延迟加载:

var data = rmscontext.Delegations
               .Include(d => d.UserFromNavigation)
               .Include(d => d.UserToNavigation)
               .FirstOrDefault(d => d.Id == id);
Run Code Online (Sandbox Code Playgroud)