无法在 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 });
我想知道延迟加载是否影响了它,所以我尝试了这个无济于事。
如果您类正确创建实体,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 });
我的问题可能更具体一点,我只是在学习 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 });
我想知道延迟加载是否影响了它,所以我尝试了这个无济于事。
如果您类正确创建实体,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 });