EF 核心导航属性为空

时间:2021-05-24 22:01:55

标签: c# .net sql-server entity-framework entity-framework-core

我正在尝试使用 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; }
}

并且在模型构建器中流畅地定义了关系:

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);
}

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

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

我错过了什么?

使用 EntityFrameworkCore V5.0.6 和 .net 5

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

install-package Microsoft.EntityFrameworkCore.Proxies

并在选项构建器中启用它们

optionsBuilder.UseLazyLoadingProxies();