MVC 5 Scaffolding с наследованием использует неправильный набор сущностей

В MVC 5 и EF 6.1 я использую простую иерархию наследования, в которой класс Student наследуется от класса Person. Для обоих классов у меня есть набор сущностей (свойство DbSet) в контексте моей базы данных:

public class DatabaseContext : DbContext
{
    public DbSet<Person> Persons { get; set; }
    public DbSet<Student> Students { get; set; }
}

Теперь, когда я прошу скаффолдер сгенерировать контроллер для подкласса Student, он использует набор сущностей Persons, что приводит к таким утверждениям, как

    Student student = db.Persons.Find(id);

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

Есть ли способ убедиться, что скаффолдер использует правильный набор сущностей (в данном случае «Студенты»)?

Обратите внимание, что удаление набора сущностей Persons не является хорошим решением, потому что это необходимо другим контроллерам.


person Pierre America    schedule 01.08.2014    source источник
comment
Вы уверены, что ваш код наследования правильный?   -  person Søren Lorentzen    schedule 01.08.2014
comment
Ну, я предполагаю, что код наследования правильный, потому что диаграмма, которую создает EF PowerTools, правильно показывает отношение наследования.   -  person Pierre America    schedule 01.08.2014
comment
Еще одно наблюдение: когда я заменяю все вхождения «Люди» на «Студенты», сгенерированный веб-интерфейс работает правильно. Кроме того, динамические данные ASP.NET (которые автоматически формируют леса) правильно работают с той же моделью EF и базой данных.   -  person Pierre America    schedule 01.08.2014


Ответы (3)


Используйте поиск и замену, чтобы изменить все вхождения в классе Controller родительского DBSet на дочерний DBSet, например, изменить Persons на Student.

Как вы, вероятно, знаете (как я думаю, вы подняли этот вопрос), Microsoft подтвердила, что это известная ошибка http://connect.microsoft.com/VisualStudio/feedbackdetail/view/945937/mvc-5-scaffolding-with-наследование-использует-неверный-набор-сущностей, но они не будут это исправлять.

person Caltor    schedule 27.10.2016

Вместо наследования, почему бы не использовать отношения, делающие personID внешним ключом? Вот почему вы можете использовать db.students.find(personID) и db.person.find(personID)

Чтобы узнать все подробности? Дополнительный код, но я не могу придумать другого способа

person Keagz93    schedule 01.08.2014

Вы можете использовать команду OfType‹>, как показано ниже:

Student student = db.Persons.OfType<Student>().SingleOrDefault(s => s.id == id);

Эта команда работает с наследованием. В этом случае, когда Student наследуется от Person.

person Geasi Puozzo    schedule 27.01.2016