Alfonso Muñoz
Alfonso Muñoz

Reputation: 1639

Entity Fw 4, MVC3, Derived class does not appear in the ObjectContext

I'm using MVC3 with EF (version 4, but not sure if 4.0,4.1,etc). I've been fighting with this since yesterday and I don't find the answer anywhere. I'm using the book "Pro Entity Framework 4.0".

I did Model First approach and because I want to use inheritance I created a basic model to do the first testings (sorry, click the link, I don't have enough rep to put a picture):

EF Model

Then with this model I created the database. I'm not very happy with the naming convention, because in spite of pluralizing the entity names, for the derived class table it created a prefixed-single table name. I'm sorry I don't have SSMS installed but have a look through the Server Explorer, see the picture:

DB created from EF Model

Then I created controllers for BaseClass with the template "Controller with read/write actions and views, using Entity Framework". It works great! It created all the views, CRUD.

For instance in the Details view I have this code:

//
    // GET: /BaseClass/Details/5

    public ViewResult Details(int id)
    {
        BaseClass baseclass = db.BaseClasses.Single(b => b.Id == id);
        return View(baseclass);
    }

It works fine.

Then I did the same for the DerivedClass and I got the controller with all the CRUD actions and the views. And now the problem. For instance the Details controller of the DerivedClass is like this:

//
    // GET: /DerivedClass/Details/5

    public ViewResult Details(int id)
    {
        DerivedClass derivedclass = db.BaseClasses.Single(d => d.Id == id);
        return View(derivedclass);
    }

As you can see it tries to get db.BaseClasses instead of db.DerivedClasses, with gives a compilation error, but db does not provide any access to the DerivedClass entity, there is nothing in db at all related with DerivedClass.But if I create manually an instance of DerivedClass in the code it is possible:

MyNamespace.Blablabla.Site.Models.DerivedClass dev = new Models.DerivedClass();

Am I missing anything? Thanks in advance.

Upvotes: 0

Views: 354

Answers (1)

Wouter de Kort
Wouter de Kort

Reputation: 39898

Inheritance hierarchies are mapped to one DbSet. If you want to filter on inherited entities you can use:

  DerivedClass derivedclass = db.BaseClasses.OfType<DerivedClass>().Single(d => d.Id == id);

The OfType<>() filters the object set for instances of the type you specify.

For adding and updating a derived entity you can also the parent DbSet and EF will map it to the correct tables.

Upvotes: 1

Related Questions