Заставить Entity Framework распознавать структуру наследования TPT

Учитывая приведенный ниже пример структуры, Entity Framework не распознает базовое наследование Entity и, следовательно, не отображает его как наследование TPT между пользователем и сущностью.

// Where DbSet<User> Users { get; set; } is used
public class User : User<int> { }

public class User<TTest> : Entity {
    public TTest Whatever { get; set; }
}

public abstract class Entity {
    public int EntityId { get; set; }
}

Я считаю, что это связано с тем, что EF будет смотреть только на структуру наследования первого уровня и никогда не увидит Entity в качестве базового класса, просто у него есть свои свойства.

Итак, мой вопрос: как я могу заставить EF распознать, что Entity действительно является базовым классом? Просто определить, что у пользователя есть ForeignKey to Entity при миграции, очевидно, недостаточно, так как эта базовая строка по-прежнему не создается.


Бонусные баллы: я уже отмечал, что не могу опуститься еще на один уровень ниже (т.е. Employee : User), но если вы хотите меня поправить, я тоже буду у вас навеки в долгу.


Обновление: копия доступна здесь, на github.com.

Обновление 2: Теория Герта Арнольда о том, что невозможно сопоставить общие классы и, таким образом, разорвать цепочку, к сожалению, привела к той же миграции, в которой User не перешел в Entity.

Update3: я могу подтвердить, что зачеркнутый "бонус" выше действительно работает, когда пользователь правильно сопоставляет. Структура наследования Entity : User : Employee работает, когда все 3 являются таблицами, она явно не работает, когда пользователь даже не может сопоставить обратно с Entity, что, как я теперь считаю, является ошибкой в ​​​​EF.


person Rudi Visser    schedule 16.02.2016    source источник
comment
Проблема в том, что EF не может сопоставить универсальный класс, например User<TTest> .   -  person Gert Arnold    schedule 17.02.2016
comment
@GertArnold Я не пытаюсь этого делать, поэтому у меня есть User.   -  person Rudi Visser    schedule 17.02.2016
comment
Да, но User<TTest> находится между Entity и User, так что для EF он разрывает цепочку наследования, если вы хотите отобразить это как TPT.   -  person Gert Arnold    schedule 17.02.2016
comment
@GertArnold Справедливое замечание - позвольте мне попробовать!   -  person Rudi Visser    schedule 17.02.2016
comment
@GertArnold Нет - та же проблема, даже если UserBase не является общим, она все равно не доходит до Entity.   -  person Rudi Visser    schedule 17.02.2016


Ответы (1)


Вам нужно добавить DbSet для каждого типа, для которого вы хотите, чтобы EntityFramework добавила таблицу, например:

public virtual DbSet<Entity> Entities { get; set; }
public virtual DbSet<User> Users { get; set; }
person Joaquin Paniagua    schedule 16.02.2016
comment
В качестве альтернативы вы также можете вызвать modelBuilder.Entity‹Entity›(); в OnModelCreating, чтобы заставить EF втягивать объект в модель. - person Rowan Miller; 17.02.2016
comment
Я не уверен, откуда это взялось - таблица Entities создана и используется другими, она отлично работает для других. Проблема в том, что он не подбирается для этой конкретной таблицы. - person Rudi Visser; 17.02.2016
comment
Есть ли шанс, что вы можете поделиться полным листингом кода (или проектом), чтобы мы могли отладить? - person Rowan Miller; 17.02.2016