Не удается загрузить свойство навигации «Один ко многим» в EF Core - PullRequest
0 голосов
/ 19 апреля 2020

Мой вопрос может быть немного конкретнее c, и я только изучаю 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;}
}

Ленивая загрузка сущностей в моем контексте БД.

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

1 Ответ

0 голосов
/ 22 апреля 2020

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 });
...