Как правильно использовать EF Core, чтобы не создавать новую соединительную таблицу для каждого производного типа? - PullRequest
0 голосов
/ 21 апреля 2020

В настоящее время у меня есть структура наследования в EntityFrameworkCore, которая выглядит следующим образом:

Продукт в качестве базового класса

Под этим продуктом может быть несколько продуктов. Например сотовый телефон. Этот мобильный телефон продается в многочисленных магазинах. Давайте назовем эту соединительную таблицу: cellphone_shop.

public class CellPhoneShop {

    public int CellPhoneId;
    public CellPhone CellPhone;

    public int ShopId;
    public Shop Shop;
}

В Entity Framework Core я ожидаю добавить что-то вроде:

            modelBuilder.Entity<CellPhoneShop>()
             .HasOne(x => x.CellPhone)
             .WithMany(x => x.CellPhoneShops)
             .HasForeignKey(x => x.CellPhoneId);

            modelBuilder.Entity<CellPhoneShop>()
             .HasOne(x => x.Shop)
             .WithMany(x => x.CellPhoneShops)
             .HasForeignKey(x => x.ShopId);

Но представьте себе, что есть два других продукта. Ноутбук и iPad. Ноутбук также продается в многочисленных магазинах, iPad - нет.

Как создать единую распределительную таблицу ProductShop с использованием ядра Entity Framework?

Я начал так:

public class ProductShop {

    public int ProductId;
    public Product Product;

    public int ShopId;
    public Shop Shop;
}

Со следующим отображением EF:

    modelBuilder.Entity<ProductShop>()
       .HasOne(x => x.Shop)
       .WithMany(x => x.ProductShops)
       .HasForeignKey(x => x.ShopId);

    modelBuilder.Entity<ProductShop>()
       .HasOne(x => x.Product)
       .WithMany(??????????)
       .HasForeignKey(x => x.ProductId);

Свойство WithMany не может быть заполнено элементом x.ProductShops поскольку только производные члены Laptop и CellPhone состоят из магазинов.

Спасибо за помощь.

1 Ответ

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

Решением было создание отдельной соединительной таблицы для каждого производного типа. В hibernate это будет сделано автоматически, в EF Core (3.0) вы по-прежнему обязаны делать это самостоятельно.

...