繁体   English   中英

EF核心导航属性为null

[英]EF core navigation property is null

我正在尝试使用 2 个实体进行代码优先模式:

  • 要求
  • 证书

请求可以具有(可选)证书,但证书始终具有请求(零或一对一)

我将实体定义如下:

public class Request
{
    public virtual Certificate Certificate { get; set; }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long RequestID { get; set; }

    public string fieldA { get; set; }
}

public class Certificate
{
    public virtual Request Request { get; set; }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long RequestID { get; set; }

    public string fieldB { get; set; }
}

并且在 model 构建器中流畅地定义了相关性:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Request>().ToTable("Requests");
    modelBuilder.Entity<Certificate>().ToTable("Certificates");

    modelBuilder.Entity<Request>()
        .HasOne<Certificate>(item => item.Certificate)
        .WithOne(item => item.Request)
        .HasForeignKey<Certificate>(item => item.RequestID);
}

model 构建正确,我可以保存实体,但是当我查询具有证书的请求时,导航属性保持 null:

Request req = await db.Requests.FirstOrDefaultAsync(item => item.RequestID == 1);
// req.Certificate is null

我错过了什么?

使用 EntityFrameworkCore V5.0.6 和 .net 5

您需要手动包含导航属性。 尝试

Request req = await db.Requests.Include(r => r.Certificate).SingleOrDefaultAsync(item => item.RequestID == 1);

你也可以摆脱虚拟,除非你想启用可怕的延迟加载(默认关闭)

在 EF 核心中,默认情况下禁用自动代理(延迟加载)。

要启用它们,请安装 package Microsoft.EntityFrameworkCore.Proxies

install-package Microsoft.EntityFrameworkCore.Proxies

并在选项生成器中启用它们

optionsBuilder.UseLazyLoadingProxies();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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