Entity Framework - Héritage

L'héritage permet de créer des modèles complexes qui reflètent mieux la façon dont les développeurs pensent et réduisent également le travail requis pour interagir avec ces modèles. L'héritage utilisé avec les entités a le même objectif que l'héritage utilisé avec les classes, de sorte que les développeurs connaissent déjà les bases du fonctionnement de cette fonctionnalité.

Jetons un coup d'œil à l'exemple suivant et en créant un nouveau projet d'application console.

Step 1 - Ajoutez le modèle de données d'entité ADO.NET en cliquant avec le bouton droit sur le nom du projet et sélectionnez Ajouter → Nouvel élément…

Step 2 - Ajoutez une entité et nommez-la Person en suivant toutes les étapes mentionnées dans le chapitre Approche Model First.

Step 3 - Ajoutez des propriétés scalaires comme indiqué dans l'image suivante.

Step 4 - Nous ajouterons deux autres entités Student et Teacher, qui héritera des propriétés de Person Table.

Step 5 - Ajoutez maintenant une entité Etudiant et sélectionnez Personne dans la liste déroulante Type de base, comme indiqué dans l'image suivante.

Step 6 - De même, ajoutez une entité Enseignant.

Step 7 - Ajoutez maintenant la propriété scalaire EnrollmentDate à l'entité Student et la propriété HireDate à l'entité Teacher.

Step 8 - Allons-y et générons la base de données.

Step 9 - Faites un clic droit sur l'aire de conception et sélectionnez Générer la base de données à partir du modèle…

Step 10- Pour créer une nouvelle base de données, cliquez sur Nouvelle connexion… La boîte de dialogue suivante s'ouvre. Cliquez sur OK.

Step 11- Cliquez sur Terminer. Cela ajoutera le fichier * .edmx.sql dans le projet. Vous pouvez exécuter des scripts DDL dans Visual Studio en ouvrant le fichier .sql. Maintenant, cliquez avec le bouton droit de la souris et sélectionnez Exécuter.

Step 12 - Allez dans l'explorateur de serveur, vous verrez que la base de données est créée avec trois tables qui sont spécifiées.

Step 13 - Vous pouvez également voir que les classes de domaine suivantes sont également générées automatiquement.

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

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

Ajoutons des étudiants et des enseignants à la base de données, puis récupérons-les de la base de données.

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

Les étudiants et les enseignants sont ajoutés dans la base de données. NTour récupérer les élèves et l'enseignant, leOfType La méthode doit être utilisée, ce qui retournera l'étudiant et l'enseignant liés au département spécifié.

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

Dans la première requête, lorsque vous utilisez OfType <Student> (), vous ne pourrez pas accéder à HireDate car la propriété HireDate fait partie de Teacher Entity et de même, la propriété EnrollmentDate ne sera pas accessible lorsque vous utilisez OfType <Teacher> ()

Lorsque le code ci-dessus est exécuté, vous recevrez la sortie suivante -

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

Nous vous recommandons d'exécuter l'exemple ci-dessus étape par étape pour une meilleure compréhension.