r3st1k25
@r3st1k25
Senior PHPomidor

Как сделать подход TPT через Fluent API при наследовании от обобщенного класса?

Привет знатокам. Опишу суть. Есть несколько типов услуг(Service.cs, ServiceMeetGuest.cs) и тип заявок(Bid.cs, BidMeetGuest.cs). С миграциями в типах услуг все просто.

А вот типы заявок наследуются от обобщенного класса, в обобщенный тип TService указывается вид услуги. Пробовал сделать таким образом:

Есть обобщенный класс:
public class BidBase<TService>
    {
        public long Id { get; set; }

        ...

        [ForeignKey("Service")]
        [Required]
        public long ServiceId { get; set; }
        public virtual TService Service { get; set; }
    }

И обьявление сущности в ApplicationDbContext:
public DbSet<BidBase<Service>> Bids { get; set; }
public DbSet<BidBase<ServiceMeetGuest>> BidsMeetGuest { get; set; }

Как оказалось, Entity Framework не поддерживает обобщенные типы..

Поэтому решил добавить классы:
public class Bid : BidBase<Service> { }
public class BidMeetGuest : BidBase<ServiceMeetGuest> {}

И DbSet's:
public DbSet<Bid> Bids { get; set; }
public DbSet<BidMeetGuest> BidsMeetGuest { get; set; }


Все ок, но связи между ними нету никакой, entity framework воспринимает их как 2 разные сущности, хотя они наследуемы от BaseBid.cs. Как сделать между ними подход Table Per Type (https://metanit.com/sharp/entityframework/7.2.php) через Fluent Api?
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ответы на вопрос 1
DarkRaven
@DarkRaven
разработка программного обеспечения
У вас по сути ТРИ разных типа.
  1. это BidBase - базовая таблица, которую вы не добавили в контекст.
  2. это Bid, расширение BidBase
  3. это BidsMeetGuest , расширение BidBase


Так как у вас BidBase не участвует как отдельный DbSet (и, соответственно, нет для него таблицы), EF думает что это просто две отдельные таблицы, структуру которых нужно замапить один-в-один, в отдельные таблицы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы