Учитывая приведенный ниже пример структуры, 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.
User<TTest>
. - person Gert Arnold   schedule 17.02.2016User
. - person Rudi Visser   schedule 17.02.2016User<TTest>
находится междуEntity
иUser
, так что для EF он разрывает цепочку наследования, если вы хотите отобразить это как TPT. - person Gert Arnold   schedule 17.02.2016UserBase
не является общим, она все равно не доходит доEntity
. - person Rudi Visser   schedule 17.02.2016