.Net Core & Entity Framework Core - access properties of subclass in model using Table Per Hierarchy

437 Views Asked by At

I'm quite new to .Net Core & Entity Framework. I'm working on a .Net Core project that has a database that was created using the Code First Approach. The following inheritance structure exists in the model (pseudo-code):

public abstract class LegalEntity{
// common properties
   public virtual LegalEntityDto ToDto()
   {
      return null;
   }
}

public class Person : LegalEntity
{
   public string FirstName {get; private set;}
   public DateTime? DateOfBirth {get; private set;}
   // ... Other person-specific properties.
   public new PersonDto ToDto()
   {
      return new PersonDto
      {
         {
         Firstname = Firstname,
         DateOfBirth = DateOfBirth
         // ...
         };
      }

public class Company : LegalEntity
    {
       public string Abn {get; private set;}
       public string CompanyName {get; private set;}
       // ... Other company-specific properties.
       public new CompanyDto ToDto()
       {
          return new CompanyDto
          {
             {
             Abn = Abn,
             CompanyName = CompanyName
             // ...
             };
          }

(the Dto's follow the same inheritance structure i.e PersonDto & CompanyDto inherit from LegalEntityDto).

In the SQL database, there is a LegalEntity table which following the Table Per Hierarchy implementation contains a column for each LegalEntity, Person and Company property, plus the Discriminator column (which is populated with the C# model class name).

I have a method that is supposed to return a list of LegalEntityDto's, which could be a combination of Person and/or Company object. Code is similar to the below (more pseudo-code):

public List<LegalEntityDto> GetImportantEntitiesForAccount(int accountNumber){
   var account = DbContext.Account.FirstOrDefault(p => p.accountNumber == accountNumber);
   if (account == null){
      throw AccountNotFoundException("Account not found for accountNumber: " + accountNumber);
   }


   var importantEntities = account.ImportantEntities;
   var dtos = importantEntities.Select(i => i.ToDto()).ToList();
   return dtos;
}

My problem is on the ToDto() call for each 'importantEntity', the abstract LegalEntity ToDto() method is called (which returns null). At run-time I can see when inspecting the collection of importantEntities that the objects contain the properties of either Person or Company, and are shown as a Castle.Proxies.PersonProxy or Castle.Proxies.CompanyProxytype.

My question is, how can I access the Person or Company properties that are obviously available at runtime, or somehow invoke the Person or Company implementation of ToDto() ?

1

There are 1 best solutions below

0
Jimmy McGill On

Solution, as commented by Ivan Stoev, was to make the base ToDto() method abstract and override in the Person and Company implementations.