如何使用Entity Framework Core中的导航属性获取实体?我在docs.microsoft
看到我必须使用.Include()
并且它正在项目中工作,但这次它不起作用。
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; }
}
错误如何正确包含所有导航属性,如果我的包含代码错误,那么它在另一个项目中是如何工作的呢?
答案 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