无法在 EF Core 中加载一对多导航 属性

Can't load One To Many navigation property in EF Core

我的问题可能更具体一点,我只是在学习 EF Core。我有两个 类。 tblBuilding 和 tblBuildingHour。简单类。不要介意 table 的命名约定。这是一个遗留数据库。如果我删除导航属性,它工作正常。我错过了什么?我需要为 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;}
}

我的数据库上下文中有实体延迟加载。

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 table 中唯一奇怪的是它有一个复合键,所以我不知道这是否是问题所在。

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

我想知道延迟加载是否影响了它,所以我尝试了这个无济于事。

https://www.learnentityframeworkcore.com/lazy-loading

如果您类正确创建实体,EF Core 就会创建关系。在仔细查看我的 类 之后,我删除了流畅的 api 关系,将我的实体 类 更改为具有 List 而不是 ICollection 属性,删除了 .Include 来自我的回购查询,它就像一个魅力。急切加载不是解决方案。令人惊讶的是,它甚至不是复合键。在我删除我的后,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 });