我的问题可能比较具体,我刚刚学习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 });
我想是不是懒加载影响了它,所以我试了一下,没有用。
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 });