我的问题可能更具体一些,我只是在学习EF Core。我有两节课。tbl建筑和tbl建筑时间。简单的类。不要介意表的命名约定。这是一个遗留数据库。如果我删除导航属性,效果会很好。我错过了什么?我需要为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表中唯一奇怪的是它有一个复合键,所以我不知道这是不是把它搞砸了。
modelBuilder.Entity<tblBuildingHour>()
.HasKey(c => new { c.BuildingID, c.BuildingHourDate });
我想知道懒惰是否影响了它,所以我尝试了一下,但没有成功。
https://www.learnentityframeworkcore.com/lazy-loading
EF Core创建关系,前提是您正确创建实体类。在仔细查看了我的类之后,我删除了fluent api关系,将实体类更改为具有List
而不是ICollection
属性,从repo查询中删除了.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 });