.Net Core & Entity Framework Core - доступ к свойствам подкласса в модели с использованием таблицы на иерархию - PullRequest
0 голосов
/ 06 марта 2019

Я совершенно новичок в .Net Core & Entity Framework.Я работаю над проектом .Net Core, в котором есть база данных, созданная с использованием подхода Code First.В модели существует следующая структура наследования (псевдокод):

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
             // ...
             };
          }

(Dto следует той же структуре наследования, т.е. PersonDto & CompanyDto наследуется от LegalEntityDto).

В базе данных SQLесть таблица LegalEntity, в которой после реализации Table Per Hierarchy есть столбец для каждого свойства LegalEntity, Person и Company, а также столбец Discriminator (который заполняется именем класса модели C #).

У меня естьметод, который должен возвращать список LegalEntityDto, который может быть комбинацией объекта Person и / или Company.Код аналогичен приведенному ниже (более псевдокод):

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;
}

Моя проблема заключается в вызове ToDto() для каждого важного объекта, вызывается абстрактный метод LegalEntity ToDto () (который возвращает ноль).).Во время выполнения я вижу при проверке коллекции importantEntities, что объекты содержат свойства Person или Company и отображаются в виде Castle.Proxies.PersonProxy или Castle.Proxies.CompanyProxy.

Мой вопрос: как я могу получить доступ к свойствам Person или Company, которые, очевидно, доступны во время выполнения, или каким-либо образом вызвать реализацию ToDto () для Person или Company? *

1 Ответ

1 голос
/ 07 марта 2019

Решение, как прокомментировал Иван Стоев , заключалось в том, чтобы сделать базовый метод ToDto () абстрактным и переопределить в реализациях Person и Company.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...