C
C#5mo ago
Core

EF Core TPC Inheritance strategy - Select query to include individual navigational property

Hello, I have 2 similar entities, which are derived from a base class. The base class is Animal, while Cat and Dog are concrete types. Two tables are created for the concrete types. In addition Dog also has a navigational property, called Owner.
c#
public abstract class Animal
{
public int Id { get; set; }
public string? Name { get; set; }
}
public class Cat : Animal
{

}
public class Dog : Animal
{
public Owner Owner { get; set; }
}
c#
public abstract class Animal
{
public int Id { get; set; }
public string? Name { get; set; }
}
public class Cat : Animal
{

}
public class Dog : Animal
{
public Owner Owner { get; set; }
}
If a DbSet<Animal> Animals is defined, then both tables can be queried at the same time, by running _dbContext.Animals.ToList() (this will do a UNION ALL in the background). The problem is that this way the navigational property Owner for Dog type is not included, since _dbContext.Animals does not have Owner property. I could make it work the following way:
c#
_dbContext.Animals.Include(a => (a as Dog).Owner)
c#
_dbContext.Animals.Include(a => (a as Dog).Owner)
This works, but I don't think this is the right way to do it, since Cat is part of the queried entities too, and I also get a warning Dereference of a possibly null reference. I think it will try to map each type to Dog and a Cat mapped to Dog will be null. How could I specify to include the navigational property related to Dog entities?
2 Replies
Keswiik
Keswiik5mo ago
This seems to match EF Core's own documentation on including values from derived types, not sure if there's anything you need to change. https://learn.microsoft.com/en-us/ef/core/querying/related-data/eager#include-on-derived-types
Eager Loading of Related Data - EF Core
Eager loading of related data with Entity Framework Core
Core
Core5mo ago
Thanks! The article was helpful, with explicit conversion the warning goes away