Entity Framework - Herança

A herança torna possível criar modelos complexos que refletem melhor como os desenvolvedores pensam e também reduzem o trabalho necessário para interagir com esses modelos. Herança usada com entidades tem o mesmo propósito que herança usada com classes, então os desenvolvedores já sabem o básico de como esse recurso funciona.

Vamos dar uma olhada no exemplo a seguir e criar um novo projeto de aplicativo de console.

Step 1 - Adicione ADO.NET Entity Data Model clicando com o botão direito do mouse no nome do projeto e selecione Add → New Item…

Step 2 - Adicione uma entidade e nomeie-a como Person, seguindo todas as etapas mencionadas no capítulo Abordagem Model First.

Step 3 - Adicione algumas propriedades escalares conforme mostrado na imagem a seguir.

Step 4 - Vamos adicionar mais duas entidades Student e Teacher, que herdará as propriedades de Person Table.

Step 5 - Agora adicione a entidade Aluno e selecione Pessoa na caixa de combinação do tipo Base, conforme mostrado na imagem a seguir.

Step 6 - Da mesma forma, adicione entidade Professor.

Step 7 - Agora adicione a propriedade escalar EnrollmentDate à entidade aluno e a propriedade HireDate à entidade Professor.

Step 8 - Vamos gerar o banco de dados.

Step 9 - Clique com o botão direito na superfície de design e selecione Gerar banco de dados do modelo ...

Step 10- Para criar um novo banco de dados, clique em Nova conexão ... O seguinte diálogo será aberto. Clique OK.

Step 11- Clique em Concluir. Isso adicionará o arquivo * .edmx.sql ao projeto. Você pode executar scripts DDL no Visual Studio abrindo o arquivo .sql. Agora clique com o botão direito e selecione Executar.

Step 12 - Vá para o explorador do servidor, você verá que o banco de dados é criado com três tabelas que são especificadas.

Step 13 - Você também pode ver que as seguintes classes de domínio também são geradas automaticamente.

public partial class Person {
   public int ID { get; set; }
   public string FirstMidName { get; set; }
   public string LastName { get; set; }
}

public partial class Student : Person {
   public System.DateTime EnrollmentDate { get; set; }
}

public partial class Teacher : Person {
   public System.DateTime HireDate { get; set; }
}

A seguir está a classe Context.

public partial class InheritanceModelContainer : DbContext {

   public InheritanceModelContainer() : 
      base("name = InheritanceModelContainer") {}

   protected override void OnModelCreating(DbModelBuilder modelBuilder) {
      throw new UnintentionalCodeFirstException();
   }

   public virtual DbSet<Person> People { get; set; }
}

Vamos adicionar alguns alunos e professores ao banco de dados e depois recuperá-los do banco de dados.

class Program {

   static void Main(string[] args) {

      using (var context = new InheritanceModelContainer()) {

         var student = new Student {
            FirstMidName = "Meredith", 
            LastName = "Alonso", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(student);

         var student1 = new Student {
            FirstMidName = "Arturo", 
            LastName = "Anand", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(student1);

         var techaer = new Teacher {
            FirstMidName = "Peggy", 
            LastName = "Justice", 
            HireDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(techaer);

         var techaer1 = new Teacher {
            FirstMidName = "Yan", 
            LastName = "Li", 
            HireDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(techaer1);
         context.SaveChanges();
      }
   }
}

Alunos e professores são adicionados ao banco de dados. Não recupere alunos e professores, oOfType o método precisa ser usado, o que retornará o Aluno e o Professor relacionados ao departamento especificado.

Console.WriteLine("All students in database"); 
Console.WriteLine("");

foreach (var student in context.People.OfType<Student>()) {
   string name = student.FirstMidName + " " + student.LastName;
   Console.WriteLine("ID: {0}, Name: {1}, \tEnrollment Date {2} ", 
      student.ID, name, student.EnrollmentDate.ToString());
}

Console.WriteLine("");
Console.WriteLine("************************************************************ *****");
Console.WriteLine("");
Console.WriteLine("All teachers in database");
Console.WriteLine("");

foreach (var teacher in context.People.OfType<Teacher>()) {
   string name = teacher.FirstMidName + " " + teacher.LastName;
   Console.WriteLine("ID: {0}, Name: {1}, \tHireDate {2} ", 
      teacher.ID, name, teacher.HireDate.ToString()); 
}

Console.WriteLine("");
Console.WriteLine("************************************************************ *****");
Console.ReadKey();

Na primeira consulta, ao usar OfType <Student> (), você não poderá acessar HireDate porque a propriedade HireDate faz parte da entidade do professor e, da mesma forma, a propriedade EnrollmentDate não estará acessível quando você usar o OfType <Teacher> ()

Quando o código acima for executado, você receberá a seguinte saída -

All students in database
ID: 1, Name: Meredith Alonso,   Enrollment Date 10/30/2015 12:00:00 AM
ID: 2, Name: Arturo Anand,      Enrollment Date 10/30/2015 12:00:00 AM
*****************************************************************  
All teachers in database
ID: 3, Name: Peggy Justice,     HireDate 10/30/2015 12:00:00 AM
ID: 4, Name: Yan Li,    HireDate 10/30/2015 12:00:00 AM
*****************************************************************

Recomendamos que você execute o exemplo acima passo a passo para melhor compreensão.