Entity Framework - Ereditarietà

L'ereditarietà consente di creare modelli complessi che riflettono meglio il modo in cui pensano gli sviluppatori e riducono anche il lavoro necessario per interagire con tali modelli. L'ereditarietà usata con le entità ha lo stesso scopo dell'ereditarietà usata con le classi, quindi gli sviluppatori conoscono già le basi di come funziona questa funzionalità.

Diamo uno sguardo al seguente esempio e creando un nuovo progetto di applicazione console.

Step 1 - Aggiungi ADO.NET Entity Data Model facendo clic con il pulsante destro del mouse sul nome del progetto e seleziona Aggiungi → Nuovo elemento ...

Step 2 - Aggiungi un'entità e chiamala Persona seguendo tutti i passaggi menzionati nel capitolo Approccio Model First.

Step 3 - Aggiungi alcune proprietà scalari come mostrato nell'immagine seguente.

Step 4 - Aggiungeremo altre due entità Student e Teacher, che erediterà le proprietà dalla tabella Person.

Step 5 - Ora aggiungi l'entità Studente e seleziona Persona dalla casella combinata Tipo di base come mostrato nell'immagine seguente.

Step 6 - Allo stesso modo aggiungi l'entità Insegnante.

Step 7 - Ora aggiungi la proprietà scalare EnrollmentDate all'entità studente e la proprietà HireDate all'entità Insegnante.

Step 8 - Andiamo avanti e generiamo il database.

Step 9 - Fare clic con il pulsante destro del mouse sull'area di progettazione e selezionare Genera database da modello ...

Step 10- Per creare un nuovo database, fare clic su Nuova connessione ... Si aprirà la seguente finestra di dialogo. Fare clic su OK.

Step 11- Fare clic su Fine. Questo aggiungerà il file * .edmx.sql nel progetto. È possibile eseguire script DDL in Visual Studio aprendo il file .sql. Ora fai clic con il tasto destro e seleziona Esegui.

Step 12 - Vai al server explorer vedrai che il database viene creato con tre tabelle specificate.

Step 13 - Puoi anche vedere che anche le seguenti classi di dominio vengono generate 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; }
}

Di seguito è la 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; }
}

Aggiungiamo alcuni Studenti e Insegnanti al database e quindi recuperiamoli dal database.

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

Gli studenti e gli insegnanti vengono aggiunti al database. NTer recuperare studenti e insegnanti, il fileOfType deve essere utilizzato il metodo, che restituirà Studente e Insegnante relativi al dipartimento specificato.

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

Nella prima query, quando si utilizza OfType <Student> (), non sarà possibile accedere a HireDate perché la proprietà HireDate fa parte di Teacher Entity e analogamente la proprietà EnrollmentDate non sarà accessibile quando si utilizza OfType <Teacher> ()

Quando il codice sopra viene eseguito, riceverai il seguente output:

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

Si consiglia di eseguire l'esempio precedente in modo graduale per una migliore comprensione.