C
C#11mo 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
Keswiik11mo 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
CoreOP11mo ago
Thanks! The article was helpful, with explicit conversion the warning goes away
Want results from more Discord servers?
Add your server