Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework - Inheritance with .Include?

I think that there's a similar post on here about this but not exactly the same...

I have two entities in my EF model - let's call them Person and Developer, with the latter inheriting from the former.

I also have an association on Developer called Qualifications. This is not visible on the Person entity.

If I'm writing a query against the context, how do I automatically .Include () the Qualifications of the Developer e.g.

from employee in context.Employee .Include ("Qualifications") select employee

doesn't work... EF complains that the relationship does not exist (I assume because it does not exist on Employee - but there's no Developer entity on the context, just Employee).

like image 941
Isaac Abraham Avatar asked Sep 22 '09 17:09

Isaac Abraham


2 Answers

How about this:

var results = from developer in ctx.Employee.OfType<Developer>()
              select new {developer, Qualifications = developer.Qualifications};

To things are interesting here:

  1. we are excluding employees that aren't Developers
  2. we are then projecting their Qualifications, and as a side effect of that projection, something called fixup with fill each developer.Qualifications too. I.e. this is another way of achieve the same effect as Include().

if you subsequently do this:

var developers = from anon in developers.AsEnumerable()
                 select anon.Developer;

You will get just developers, and they will have their Qualifications loaded too.

See Tip 1 for more info on why this works

Hope this helps

Alex

like image 45
Alex James Avatar answered Sep 29 '22 09:09

Alex James


I've come across this problem and experimented a little. Here is what i found worked using LINQ 2 Entity.

Say we have in your example Person <-- Developer ---- Qualifications.

If you would like to select a Developer with Qualifications included, you would do this.

var dev = (from d in context.Persons.OfType<Developer>
                            .Include("Qualifications")
          where d.ID == id
          select d).FirstOfDefault();

Now lets say we have another association between Person and Address, we can also include Address into the select also using LINQ 2 Entity.

var dev = (from d in context.Persons
                            .Include("Address")
                            .OfType<Developer>()
                            .Include("Qualifications")
          where d.ID == id
          select d).FirstOfDefault();

Notice how I have included the things I needed before I converted the Type and also included again after the conversion. Both includes should now work together without any problems. I have tested these methods and they both work. I hope they work for you given you have your inheritance setup correctly.

GL.

like image 95
Tri Q Tran Avatar answered Sep 29 '22 10:09

Tri Q Tran