无法加载EF Core中的 "一对多 "导航属性。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法加载EF Core中的 "一对多 "导航属性。相关的知识,希望对你有一定的参考价值。

我的问题可能比较具体,我刚刚学习EF Core。我有两个类。 tblBuilding和tblBuildingHour。简单的类。不要介意表的命名惯例。这是一个传统的数据库。如果我去掉导航属性,它就能正常工作。我缺少了什么?我需要为Castle代理配置什么吗?是复合键吗?是导航属性的懒加载吗?我很疑惑。

public class tblBuilding {
    public int ID {get;set;}
    public string Name {get;set;}
    public virtual ICollection<tblBuildingHour> BuildingHours {get;set;}
}

public class tblBuildingHour {
    public int BuildingID {get;set;}
    public DateTime BuildingHourDate { get;set; }
    public DateTime StartTime {get;set;}
    public DateTime EndTime {get;set;
    public virtual Building Building {get;set;}
}

我的db上下文中的实体有懒加载。

services.AddDbContext<EMSDataContext>(options => options.UseLazyLoadingProxies()
    .UseSqlServer(Configuration.GetSection(EmsDevDb).Value)
    .UseLoggerFactory(_loggerFactory));

在dbContext中,我添加了一比多的关系。

modelBuilder.Entity<tblBuilding>()
    .HasMany(b => b.BuildingHours)
    .WithOne(r => r.Building)
    .HasForeignKey(r => r.BuildingID);

在这个tblBuildingHour表中唯一奇怪的地方就是它有一个复合键,所以我不知道是不是这个原因造成的。

modelBuilder.Entity<tblBuildingHour>()
    .HasKey(c => new { c.BuildingID, c.BuildingHourDate });

我想是不是懒加载影响了它,所以我试了一下,没有用。

https:/www.learnentityframeworkcore.comlazy-loading

答案

EF核心创建的关系,只要你创建你的实体类 正确. 在仔细观察了我的类之后,我删除了fluent api关系,将我的实体类改为有 List 而不是 ICollection 属性,删除 .Include 从我的repo查询,它的工作像一个魅力。急于加载并不是解决办法。令人惊讶的是,它甚至不是复合键。在我删除了我的关系后,EF Core设法正确创建关系。

补记:要说明的是,删除.Include不是修复的一部分,那只是针对懒惰加载的。

删除了

modelBuilder.Entity<tblBuilding>()
    .HasMany(b => b.BuildingHours)
    .WithOne(r => r.Building)
    .HasForeignKey(r => r.BuildingID);

已更新

[Table("tblBuilding")]
public class EMSBuilding
{
    public int ID { get; set; }
    public string Name{ get; set; }

    public virtual List<EMSBuildingHour> Hours { get; set; }
}

[Table("tblBuildingHours")]
public class EMSBuildingHour
{
    [Column("BuildingHoursDate")]
    public DateTime BuildingHourDate { get; set; }
    public DateTime OpenTime { get; set; }
    public DateTime CloseTime { get; set; }

    public int BuildingID { get; set; }
    public virtual EMSBuilding Building { get; set; }
}

modelBuilder.Entity<EMSBuildingHour>()
    .HasKey(c => new { c.BuildingID, c.BuildingHourDate });

以上是关于无法加载EF Core中的 "一对多 "导航属性。的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 中的一对一关系(无法确定一对一关系的子/依赖方)

EF Core中通过Fluent API配置一对多关系

EF Core 一对一 一对多 多对多 关系定义

EF CORE - 创建一对多地图

EF Core - 为啥“无限”嵌套急切加载?

EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体