我有两张桌子,我无法更改。两者都有一个 job_id 列,它是一个 Guid,本质上以一对多关系连接这些表。
SQL 中这些表之间没有外键。我想要有两个 ef 核心实体,它们之间有一个导航属性。一个 SysJob 包含多个 SysJobSteps。
具有 Guid 外键的列表导航属性是否可以返回多个实体?
这是我的代码:
public class SysJob
{
public Guid JobId { get; set; }
public List<SysJobStep> SysJobSteps { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public class SysJobStep
{
public Guid JobId { get; set; }
public SysJob SysJob { get; set; }
public string StepName { get; set; }
public string Command { get; set; }
}
模型构建器:
modelBuilder.Entity<SysJob>()
.HasKey(j => j.JobId);
modelBuilder.Entity<SysJob>()
.HasMany(j => j.SysJobSteps)
.WithOne(s => s.SysJob)
.HasForeignKey(j => j.JobId);
modelBuilder.Entity<SysJobStep>()
.HasKey(s => s.JobId);
但是,我的包含查询仅为每个 SysJob 返回一个 SysJobStep:
var x = context.SysJobs
.Include(j => j.SysJobSteps)
.ToList();
我将查询记录到控制台中,发现 EF Core 本身调用了一个 sql 查询,它返回的行数比 linq 查询更多。
导航属性仅返回单个实体的原因是因为 job_id 列不唯一。应使用“step_uid”列。
modelBuilder.Entity<SysJobStep>()
.HasKey(s => s.StepUId);
public class SysJobStep
{
public Guid JobId { get; set; }
public Guid StepUId { get; set; }
public SysJob SysJob { get; set; }
public string StepName { get; set; }
public string Command { get; set; }
}