【问题标题】:EF core navigation property is nullEF 核心导航属性为空
【发布时间】:2021-08-13 04:38:00
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 如果 LazyLoad 代理未启用,您可能需要删除 virtual 关键字,否则 EF Core 将被烧毁,甚至 .Include 也不会急切加载相关实体。 (基于其他报告的怪异/w .Include() EF Core 中的“不工作”。)我个人使用 LazyLoad 作为故障保护,但强烈建议熟悉投影 (Select / ProjectTo) 以构建更有效的查询,而无需因延迟/急切加载问题而绊倒。
  • 最后我发现,在EF6中默认启用延迟加载,这里你必须启用它(使用optionsBuilder.UseLazyLoadingProxies())并添加Microsoft.EntityFrameworkCore.Proxies
  • 是的。但不要这样做。
【解决方案2】:

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

要让他们安装包 Microsoft.EntityFrameworkCore.Proxies

install-package Microsoft.EntityFrameworkCore.Proxies

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

optionsBuilder.UseLazyLoadingProxies();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多