我正在尝试使用 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
答案 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();