【问题标题】:What is the correct way to get an Entity with it's navigation property in Entity Framework Core?在 Entity Framework Core 中获取具有导航属性的实体的正确方法是什么?
【发布时间】:2018-02-20 04:33:11
【问题描述】:

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

模型.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; }
}

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

【问题讨论】:

  • 我不确定这是否能解决您的问题,我也不确定 EFCore 是否需要这样做,但我总是将导航属性设为virtual。你可以试一试吗? (即public virtual List&lt;UniEmail&gt; Emails { get; set; }
  • @nbokmans 仍然无法正常工作,你能看出我的代码或模型有什么问题吗?
  • 您可以尝试添加反向导航属性吗?例如将[ForeignKey("UniversityId")] public virtual UniversityModel University { get; set; } 添加到UniEmail
  • 确保UniveristyModel 中的ID 字段也具有[Key] 属性。另一个疯狂的猜测是ID 是名称敏感的,这意味着您在UniversityModel ID 中命名了主键列,但在您的UniEmail 中,您正试图寻找外键UniversityId(小写@987654339 @,改为public int UniversityID)。
  • 你明白了..所有问题都是ForeignKey ForeignKey应该是UniveristyModelID..谢谢。

标签: c# entity-framework-core


【解决方案1】:

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

EF Core FK 命名约定在文档的Fully Defined Relationships 部分进行了说明:

如果依赖实体包含一个名为 的属性,那么它将被配置为外部键。

换句话说,UniversityId 将被视为 FK,如果:

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

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

当然也可以使用 fluent 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

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多