Основные несколько подобъектов Entity Framework Включают / затем включают

#c# #entity-framework #entity-framework-core

Вопрос:

У меня возникли проблемы с включением всех сущностей при использовании EF для запроса. Используя фиктивные метки, моя база данных имеет структуру семейства, которая содержит коллекцию объектов-людей и Дом. С каждым объектом Person связан Кошелек, с которым у Кошелька есть объект водительских прав. В доме есть три объекта: Ктичен, Логово и Гараж. Мои модели были созданы с использованием подхода, ориентированного на БД, и я могу предоставить их в случае необходимости.

Но у меня есть «Лямбда-выражение, используемое внутри Include, недопустимо». ошибка при запуске этого кода:

 public Family GetFamily(int familyId)
{
    DBContext context = new DBContext();

    Family family= context.Family.Where(fam=> fam.Id== famId)
        .Include(fam => fam.PersonCollection)
            .ThenInclude(p => p.Wallet)
                .ThenInclude(w => w.License)
        .Include(fam => fam.House)
            .ThenInclude(h => h.Kitchen)
        .Include(fam => fam.House)
            .ThenInclude(h => h.Den)
        .Include(fam => fam.House)
            .ThenInclude(h => h.Garage)
        .First();

return family
}
 

Если я прокомментирую, что включает в себя Лицензию и две из трех комнат в доме, она работает, но в остальном это не так.

Вот все модели

 public partial class Family
{
    public Family()
    {
        PersonCollection = new HashSet<PersonCollection>();
    }

    public int HouseId { get; set; }

    public virtual House House { get; set; }
    public virtual ICollection<PersonCollection> PersonCollection { get; set; }
}


public partial class House
{
    public House()
    {
        Family = new HashSet<Family>();
        Den = new HashSet<Den>();
    }

    public int Id { get; set; }
    public byte KitchenId { get; set; }
    public int? DenId { get; set; }
    public int? GarageId { get; set; }
    public virtual Kitchen Kitchen { get; set; }
    public virtual Garage GarageNavigation { get; set; }
    public virtual Den DenNavigation { get; set; }
    public virtual ICollection<Family> Family{ get; set; }
    public virtual ICollection<Den> Den { get; set; }
}


public partial class Kitchen
{
    public Kitchen()
    {
        House = new HashSet<House>();
    }

    public byte Id { get; set; }

    public virtual ICollection<House> House { get; set; }
}


public partial class Garage
{
    public Garage()
    {
        House = new HashSet<House>();
    }

    public int Id { get; set; }

    public virtual ICollection<House> House { get; set; }
}

public partial class Den
{
    public Den()
    {
        House = new HashSet<House>();
    }

    public int Id { get; set; }

    public virtual ICollection<House> House { get; set; }
}


public partial class Person
{
    public int FamilyId{ get; set; }
    public int? WalletId { get; set; }

    public virtual Wallet Wallet { get; set; }
    public virtual Family Family { get; set; }
}

public partial class Wallet
{
    public Wallet()
    {
        PersonCollection = new HashSet<Person>();
    }

    public int Id { get; set; }
    public int? DenId { get; set; }

    public virtual License License { get; set; }
    public virtual ICollection<Person> PersonCollection { get; set; }
}


public partial class License
{
    public License()
    {
        Wallet = new HashSet<Wallet>();
    }

    public int Id { get; set; }

    public virtual ICollection<Wallet> Wallet { get; set; }
}


 

Вот строители моделей. Мне пришлось переименовать и удалить много вещей, чтобы упростить и запутать наш код, но, надеюсь, я сохранил все, что имеет отношение к делу.

 protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Family>(entity =>
    {
        entity.HasOne(d => d.House)
            .WithMany(p => p.Family)
            .HasForeignKey(d => d.FamilyId)
            .OnDelete(DeleteBehavior.ClientSetNull)
            .HasConstraintName("FK_Family_House");
    });
    
    modelBuilder.Entity<Person>(entity =>
    {
        entity.HasOne(d => d.Wallet)
            .WithMany(p => p.Person)
            .HasForeignKey(d => d.WalletId)
            .HasConstraintName("FK_Person_Wallet");

        entity.HasOne(d => d.Family)
            .WithMany(p => p.Person)
            .HasForeignKey(d => new { d.FamilyId })
            .OnDelete(DeleteBehavior.ClientSetNull)
            .HasConstraintName("FK_Person_Family");
    });
    
    modelBuilder.Entity<Wallet>(entity =>
    {
        entity.HasOne(d => d.LicenseNavigation)
            .WithMany(p => p.Wallet)
            .HasForeignKey(d => d.License)
            .HasConstraintName("FK_Wallet_License");
    });
    
    modelBuilder.Entity<License>(entity =>
    {
        entity.ToTable("License", "DBO");
    });
            
    modelBuilder.Entity<House>(entity =>
    {
        entity.HasOne(d => d.Kitchen)
            .WithMany(p => p.House)
            .HasForeignKey(d => d.KitchenId)
            .OnDelete(DeleteBehavior.ClientSetNull)
            .HasConstraintName("FK_House_Kitchen");

        entity.HasOne(d => d.GarageNavigation)
            .WithMany(p => p.House)
            .HasForeignKey(d => d.Garage)
            .HasConstraintName("FK_House_Garage");

        entity.HasOne(d => d.DenNavigation)
            .WithMany(p => p.House)
            .HasForeignKey(d => d.Garage)
            .HasConstraintName("FK_House_Garage");
    });
    
    modelBuilder.Entity<Kitchen>(entity =>
    {
        entity.Property(e => e.Id).ValueGeneratedOnAdd();
    });
    
    modelBuilder.Entity<Garage>(entity =>
    {
        entity.Property(e => e.Description)
            .IsRequired()
            .HasMaxLength(50);
    });
    
    modelBuilder.Entity<Den>(entity =>
    {
        entity.ToTable("Den", "DBO");

        entity.Property(e => e.Description)
            .IsRequired()
            .HasMaxLength(100)
            .IsUnicode(false);
    });
}
 

Комментарии:

1. Не могли бы вы предоставить некоторую дополнительную информацию о Licence классах и Wallet классах, а также ModelBuilder их конфигурацию?

2. Интересно, почему у вас коллекции с PersonCollection классом, а не Person с классом . Тем не менее, я тоже попросил ModelBuilder настроить, может быть, вы что-то там упустили

3. Все еще пытаюсь найти для вас конфигурацию ModelBuilder — она была настроена другим разработчиком. У меня было несколько опечаток в модели, где я не подделал настоящие названия моделей, которые я исправил.

4. Вы можете найти конфигурацию ModelBuilder в OnModelCreating методе вашего DbContext класса