Entity Framework - Vererbung

Durch Vererbung können komplexe Modelle erstellt werden, die das Denken der Entwickler besser widerspiegeln und den Arbeitsaufwand für die Interaktion mit diesen Modellen verringern. Die mit Entitäten verwendete Vererbung dient demselben Zweck wie die mit Klassen verwendete Vererbung, sodass Entwickler bereits die Grundlagen der Funktionsweise dieser Funktion kennen.

Schauen wir uns das folgende Beispiel an und erstellen ein neues Konsolenanwendungsprojekt.

Step 1 - Fügen Sie das ADO.NET-Entitätsdatenmodell hinzu, indem Sie mit der rechten Maustaste auf den Projektnamen klicken und Hinzufügen → Neues Element auswählen.

Step 2 - Fügen Sie eine Entität hinzu und nennen Sie sie Person, indem Sie alle im Kapitel Model First beschriebenen Schritte ausführen.

Step 3 - Fügen Sie einige skalare Eigenschaften hinzu, wie in der folgenden Abbildung gezeigt.

Step 4 - Wir werden zwei weitere Entitäten hinzufügen Student und Teacher, die die Eigenschaften von Personentabelle erben.

Step 5 - Fügen Sie nun die Entität Student hinzu und wählen Sie Person aus der Combobox vom Basistyp aus, wie in der folgenden Abbildung gezeigt.

Step 6 - Fügen Sie auf ähnliche Weise eine Lehrerentität hinzu.

Step 7 - Fügen Sie nun der Schülerentität die skalare Eigenschaft EnrollmentDate und der Lehrerentität die Eigenschaft HireDate hinzu.

Step 8 - Lassen Sie uns fortfahren und die Datenbank generieren.

Step 9 - Klicken Sie mit der rechten Maustaste auf die Entwurfsoberfläche und wählen Sie Datenbank aus Modell generieren…

Step 10- Um eine neue Datenbank zu erstellen, klicken Sie auf Neue Verbindung… Der folgende Dialog wird geöffnet. OK klicken.

Step 11- Klicken Sie auf Fertig stellen. Dadurch wird dem Projekt die Datei * .edmx.sql hinzugefügt. Sie können DDL-Skripte in Visual Studio ausführen, indem Sie die SQL-Datei öffnen. Klicken Sie nun mit der rechten Maustaste und wählen Sie Ausführen.

Step 12 - Gehen Sie zum Server-Explorer. Sie werden sehen, dass die Datenbank mit drei angegebenen Tabellen erstellt wurde.

Step 13 - Sie können auch sehen, dass die folgenden Domänenklassen ebenfalls automatisch generiert werden.

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

Es folgt die Context-Klasse.

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

Fügen wir der Datenbank einige Schüler und Lehrer hinzu und rufen sie dann aus der Datenbank ab.

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

Schüler und Lehrer werden in die Datenbank aufgenommen. Um Schüler und Lehrer zu finden, dieOfType Es muss eine Methode verwendet werden, die Schüler und Lehrer in Bezug auf die angegebene Abteilung zurückgibt.

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

Wenn Sie in der ersten Abfrage OfType <Student> () verwenden, können Sie nicht auf HireDate zugreifen, da die HireDate-Eigenschaft Teil der Lehrerentität ist und auf die EnrollmentDate-Eigenschaft ebenfalls nicht zugegriffen werden kann, wenn Sie OfType <Teacher> () verwenden.

Wenn der obige Code ausgeführt wird, erhalten Sie die folgende Ausgabe:

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

Wir empfehlen, dass Sie das obige Beispiel zum besseren Verständnis Schritt für Schritt ausführen.