Pierre America
Pierre America

Reputation: 146

MVC 5 Scaffolding with inheritance uses the wrong entity set

With MVC 5 and EF 6.1 I am using a simple inheritance hierarchy, where class Student inherits from class Person. For both classes I have an entity set (DbSet property) in my database context:

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

Now when I ask the scaffolder to generate a controller for Student, the subclass, it uses the Persons entity set, leading to statements such as

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

where the compiler obviously complains that it cannot just convert any Person to a Student.

Is there a way to make sure that the scaffolder uses the correct entity set (Students in this case)?

Note that removing the Persons entity set is not a good solution, because there are other controllers that need that.

Upvotes: 5

Views: 593

Answers (3)

Caltor
Caltor

Reputation: 2756

Use find and replace to change all occurrences in the Controller class of the parent DBSet to the child DBSet eg change Persons to Students.

As you probably know (as I think you raised it) Microsoft have confirmed this is a known bug http://connect.microsoft.com/VisualStudio/feedbackdetail/view/945937/mvc-5-scaffolding-with-inheritance-uses-the-wrong-entity-set but they won't be fixing it.

Upvotes: 2

Geasi Puozzo
Geasi Puozzo

Reputation: 827

You can use the command OfType<>, as shown:

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

This command works with inheritance. In this case, when Student inherits from Person.

Upvotes: 1

Keagz93
Keagz93

Reputation: 716

Instead of inheritance why not use a relationship making personID the Foreign key ? That why you can db.students.find(personID) And db.person.find(personID)

To find all details ? Extra code but I can't think of another way

Upvotes: 1

Related Questions