[英]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.