在Entity Framework Core中使用它的导航属性获取实体的正确方法是什么?

时间:2018-02-19 18:13:09

标签: c# entity-framework-core

如何使用Entity Framework Core中的导航属性获取实体?我在docs.microsoft看到我必须使用.Include()并且它正在项目中工作,但这次它不起作用。

Model.cs

public class UniversityModel
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string LongDescription { get; set; }
    public string Address { get; set; }
    public List<UniSession> Sessions { get; set; }
    public DateTime Date { get; set; }
    public List<UniEmail> Emails { get; set; }
    public List<UniPhone> Phones { get; set; }

}

我正在使用它的导航属性访问UniversityModel。

UniversityModel university = await _context.Universities
    .Include(u => u.Phones)
    .Include(u => u.Emails)
    .Include(u => u.Sessions)
    .SingleOrDefaultAsync(u => u.ID == id);

正确获取university但导航属性不包括在内。 为了清楚地看下面的Model所有导航属性模型与大学的外键相同。

public class UniEmail
{
    public int ID { get; set; }
    public int UniversityId { get; set; }
    [StringLength(50)]
    public string Email { get; set; }
}

错误如何正确包含所有导航属性,如果我的包含代码错误,那么它在另一个项目中是如何工作的呢?

1 个答案:

答案 0 :(得分:3)

问题是您的实体模型不遵循EF Core约定,并且您不使用流畅配置。虽然EF通过集合导航属性发现关系,但由于没有反向引用导航属性且UniversityId字段未标识为FK,因此EF将FK映射到名为UniversityModelId的{​​{3}}。

EF Core FK命名约定在文档的shadow property部分进行了解释:

  

如果从属实体包含名为&lt;主键属性名称&gt;,&lt;导航属性名称&gt;&lt;主键属性名称&gt;或&lt;主体实体名称&gt;&lt;主键属性名称&gt;的属性。然后它将被配置为外键。

换句话说,UniversityId在以下情况下将被视为FK:

(1)UniversityModel类被称为University
(2)ID类的UniversityModel属性称为UniversityID(并标记为[Key]属性,因为它与PK约定不匹配)
(3)添加名为University的反向导航属性:

public UniversityModel University { get; set; }
public int UniversityId { get; set; }

当然,它可以使用流畅的API显式映射:

modelBuilder.Entity<UniversityModel>()
    .HasMany(e => e.Emails) // with collection navigation property
    .WithOne() // and no reference navigation property
    .HasForeignKey(e => e.UniversityId); // and foreign key