实体框架核心2并未急切地加载包含的实体

时间:2018-02-01 03:05:47

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

我有一些代码,我正在从dotnetcore1.1升级到dotnetcore2.0(相应的EF核心从1到2)

我有以下模型(当然是匿名的),并使用Npgsql与postgres数据库通信。

[Table("company")]
public class Company
{
  [Key, Column("id")]
  public int Id { get; set; }

  [Column("name", TypeName = "VARCHAR")]
  public string Name { get; set; }

  [Column("serialnumber")]
  public int SerialNumber { get; set; }

  [ForeignKey("serialnumber")]
  public virtual CompanyTypeMarker CompanyTypeMarker { get; set; }
}

[Table("companytypemarker")]
public class CompanyTypeMarker
{
    [Key, Column("serialnumber"), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int SerialNumber { get; set; }

    [Column("sitetype")]
    public CompanyType CompanyType { get; set; } = CompanyType.Customer;
}

我有这个LINQ查询:

var company = await db.Companies
  .Include(c => c.CompanyTypeMarker)
  .FirstOrDefault(cc => cc.SerialNumber == serialNumber);

在dotnetcore1.1中,Company实体将加载,并且它的关联CompanyTypeMarker实体也将被加载并可通过Company.CompanyTypeMarker属性访问

在dotnetcore2.0中,Company实体加载,但Company.CompanyTypeMarker实体为空。

查看日志输出,EF核心正在生成以下SQL:

  SELECT "c"."id", "c"."name", "c"."serialnumber", "c.CompanyTypeMarker"."serialnumber", "c.CompanyTypeMarker"."companytype"
  FROM "company" AS "c"
  INNER JOIN "companytypemarker" AS "c.CompanyTypeMarker" ON "c"."serialnumber" = "c.CompanyTypeMarker"."serialnumber"
  WHERE "c"."serialnumber" = @__SerialNumber_0
  LIMIT 1

生成的SQL证明EF核心正在拾取导航属性,因为它为正确的属性生成正确的sql JOIN ...就在它回到C#时,由于某种原因它没有拾取和填充JOINed值。

有人可以帮忙吗?如前所述,这适用于EF Core 1,它似乎是导航属性的相当标准的使用

1 个答案:

答案 0 :(得分:1)

好的,结果我在OnModelCreating

中也有这个
modelBuilder
  .Entity<Company>(entity => {
    entity.HasOne(x => { x.CompanyTypeMarker).WithOne().OnDelete(DeleteBehavior.Restrict);
  })

我将其更改为HasOne(...).WithMany(),现在急切地正确加载