Entity Framework - Herencia

La herencia permite crear modelos complejos que reflejan mejor cómo piensan los desarrolladores y también reducen el trabajo requerido para interactuar con esos modelos. La herencia usada con entidades tiene el mismo propósito que la herencia usada con clases, por lo que los desarrolladores ya conocen los conceptos básicos de cómo funciona esta característica.

Echemos un vistazo al siguiente ejemplo y creemos un nuevo proyecto de aplicación de consola.

Step 1 - Agregue ADO.NET Entity Data Model haciendo clic con el botón derecho en el nombre del proyecto y seleccione Agregar → Nuevo elemento ...

Step 2 - Agregue una entidad y asígnele el nombre Persona siguiendo todos los pasos mencionados en el capítulo Enfoque Model First.

Step 3 - Agregue algunas propiedades escalares como se muestra en la siguiente imagen.

Step 4 - Agregaremos dos entidades más Student y Teacher, que heredará las propiedades de Person Table.

Step 5 - Ahora agregue la entidad Estudiante y seleccione Persona en el cuadro combinado Tipo de base como se muestra en la siguiente imagen.

Step 6 - De manera similar, agregue la entidad Teacher.

Step 7 - Ahora agregue la propiedad escalar EnrollmentDate a la entidad del estudiante y la propiedad HireDate a la entidad del maestro.

Step 8 - Sigamos adelante y generemos la base de datos.

Step 9 - Haga clic derecho en la superficie de diseño y seleccione Generar base de datos a partir del modelo ...

Step 10- Para crear una nueva base de datos, haga clic en Nueva conexión ... Se abrirá el siguiente cuadro de diálogo. Haga clic en Aceptar.

Step 11- Haga clic en Finalizar. Esto agregará el archivo * .edmx.sql en el proyecto. Puede ejecutar scripts DDL en Visual Studio abriendo el archivo .sql. Ahora haga clic derecho y seleccione Ejecutar.

Step 12 - Vaya al explorador del servidor, verá que la base de datos se crea con tres tablas que se especifican.

Step 13 - También puede ver que las siguientes clases de dominio también se generan automáticamente.

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 continuación se muestra la clase de contexto.

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

Agreguemos algunos estudiantes y profesores a la base de datos y luego recuperémoslo de la base de datos.

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

Los estudiantes y profesores se agregan a la base de datos. Para recuperar a los estudiantes y al profesor,OfType es necesario utilizar el método, que devolverá al alumno y al profesor relacionados con el 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();

En la primera consulta, cuando usa OfType <Student> (), entonces no podrá acceder a HireDate porque la propiedad HireDate es parte de Teacher Entity y, de manera similar, la propiedad EnrollmentDate no será accesible cuando use OfType <Teacher> ()

Cuando se ejecuta el código anterior, recibirá el siguiente resultado:

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
*****************************************************************

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprensión.