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

问题描述 投票:0回答:1

我的问题可能比较具体,我刚刚学习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

asp.net-core entity-framework-core lazy-loading one-to-many ef-fluent-api
1个回答
0
投票

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 });
© www.soinside.com 2019 - 2024. All rights reserved.