Database
 sql >> Datenbank >  >> RDS >> Database

Arbeiten mit Vererbung in Entity Framework Core

Entity Framework Core von Microsoft ist eine plattformübergreifende, schlanke und flexible Version seines Vorgängers Entity Framework. EF Core ist ein objektrelationales Mapper-Tool (ORM), das eine standardisierte Methode zum Speichern und Abrufen von Daten in und aus verschiedenen Datenquellen bietet.

Durch Programmierung nach einem konzeptionellen statt einem relationalen Modell. Daher gibt es keine Impedanzabweichung zwischen der Darstellung der Daten in der Anwendung und der Speicherung in der Datenbank.

Vererbung ist eine Funktion der objektorientierten Programmierung, die es Ihnen ermöglicht, Unterklassen von einer Basisklasse zu erstellen und dadurch die Funktionen der Basisklasse zu erweitern. Entity Framework Core bietet hervorragende Unterstützung für die Vererbung. In diesem Artikel wird erläutert, wie wir die Vererbung in Entity Framework Core implementieren können. Wir nutzen EntityDeveloper, um mit der Datenbank zu kommunizieren.

Voraussetzungen

Um mit den in diesem Artikel gezeigten Codebeispielen arbeiten zu können, sollte Folgendes auf Ihrem System installiert sein:

  • Visual Studio 2019 Community Edition (herunterladen)
  • dotConnect für PostgreSQL (herunterladen)
  • Entitätsentwickler

Sie können eine Kopie von Entity Developer (Testversion) hier herunterladen:https://www.devart.com/entitydeveloper/download.html.

Datenbank erstellen

Nachdem das ASP.NET Core-Web-API-Projekt nun in Visual Studio 2019 erstellt wurde; Der nächste Schritt besteht darin, die Datenbank zu erstellen. Beachten Sie, dass wir der Einfachheit halber in diesem Beispiel eine Datenbank mit ein paar zwei Tabellen mit einfachem Design verwenden. Erstellen Sie eine Datenbank namens Demo und erstellen Sie darin drei Tabellen (Person, Benutzer und Manager). Die Felder in diesen Tabellen sollten den später in diesem Artikel gezeigten Eigenschaften der Modellklassen zugeordnet werden.

Erstellen Sie ein neues ASP.NET Core-Web-API-Projekt

Angenommen, die erforderliche Software wurde auf Ihrem Computer installiert, um mit Entity Developer arbeiten zu können, führen Sie die unten beschriebenen Schritte aus, um ein neues ASP.NET Core-Web-API-Projekt zu erstellen.

1. Öffnen Sie zunächst die IDE von Visual Studio 2019.
2. Klicken Sie anschließend auf Neues Projekt erstellen sobald die IDE geladen ist.
3. Klicken Sie auf Neues Projekt erstellen .
4. Wählen Sie als Nächstes ASP.NET Core-Webanwendung aus .
5. Klicken Sie auf Weiter .
6. Geben Sie den Projektnamen und den Speicherort an – wo es in Ihrem System gespeichert werden soll.
7. Klicken Sie optional auf Lösung und Projekt im selben Verzeichnis platzieren Kontrollkästchen.
8. Klicken Sie anschließend auf Erstellen .
9. Im Create a new ASP.NET Core Web Application Dialogfenster, das als nächstes angezeigt wird, wählen Sie API als Projektvorlage.
10. Wählen Sie als Version ASP.NET Core 3.1 oder höher aus.
11. Sie sollten die Für HTTPS konfigurieren deaktivieren und Docker-Unterstützung aktivieren Optionen, indem Sie die entsprechenden Kontrollkästchen deaktivieren.
12. Da wir in diesem Beispiel keine Authentifizierung verwenden, geben Sie die Authentifizierung als Keine Authentifizierung an .
13. Klicken Sie abschließend auf Erstellen Schaltfläche, um den Vorgang abzuschließen.

Erstellen Sie ein Entitätsdatenmodell

Als nächstes sollten Sie ein Entitätsdatenmodell erstellen. Wenn Sie ein Modell in Entity Developer erstellen, stehen zwei Optionen zur Auswahl:Datenbank zuerst (standardmäßig ausgewählt) und Modell zuerst. In diesem Beispiel nutzen wir den Database First-Ansatz. Denken Sie daran, Aus Datenbank generieren auszuwählen Option zum Generieren Ihres Modells aus der Datenbank und Auswählen der Datenbankobjekte, die Sie als Teil Ihres Entitätsdatenmodells verwenden möchten.

Befolgen Sie die unten beschriebenen Schritte, um ein Entitätsdatenmodell in Entity Developer mit dem Database-First-Ansatz zu erstellen.

1. Wählen Sie Ihr Projekt im Solution Explorer aus Fenster.
2. Klicken Sie mit der rechten Maustaste und wählen Sie Hinzufügen>Neues Element .
3. Wählen Sie Devart EF Core-Modell aus als Vorlage wie unten gezeigt.

4. Geben Sie einen Namen für Ihr Entitätsdatenmodell an und klicken Sie auf Hinzufügen .
5. Legen Sie die Verbindungseigenschaften fest und testen Sie die Verbindung.
6. Klicken Sie auf Weiter weitermachen.
7. Standardmäßig ist die Option „Generate from Database“ ausgewählt. Da das Modell aus der Datenbank erstellt werden soll, klicken Sie auf Weiter weitermachen.
8. Deaktivieren Sie alle Optionen und geben Sie dann nur die Datenbankobjekte an, die Teil des Modells sein sollen. Hier sollten Sie die Tabellen Produkte und Kategorien auswählen.
9. Im Setup Namensregeln Bildschirm können Sie optional Namensregeln für Ihre Entitäten festlegen.
10. Im nächsten Bildschirm können Sie optional die Modelleigenschaften angeben.
11. Im nächsten Bildschirm können Sie optional den Inhalt des Modelldiagramms auswählen.
12. Im nächsten Bildschirm können Sie optional Codegenerierungsvorlagen angeben.
13. Geben Sie die Codegenerierungsvorlage Ihrer Wahl an.
14. Klicken Sie abschließend auf Fertig stellen um den Vorgang abzuschließen.

Ihr ADO.NET-Entitätsdatenmodell mit Entity Developer wird zusammen mit dem Datenkontext und den Modellklassen erstellt.

Vererbung im Entity Framework Core

Mit Entity Framework Core (EF Core) können Sie einer Datenbank eine .NET-Klassenhierarchie zuordnen. Daher können Sie Ihre .NET-Entitäten erstellen, die als Basis- und abgeleitete Typen dargestellt werden, und EF Core kann das Datenbankschema für Sie generieren. Da EF Core jedoch nicht automatisch nach Basis- oder abgeleiteten Klassen sucht, müssen Sie explizit einen CLR-Typ in Ihrem Modell deklarieren, wenn Sie möchten, dass er zugeordnet wird. Es ist zu beachten, dass es nicht ausreicht, nur den Basistyp anzugeben, d. h. EF Core wird nicht automatisch gezwungen, alle Untertypen einzubeziehen.

Das folgende Code-Listing veranschaulicht, wie Sie einen benutzerdefinierten Datenkontext für eine Klasse sowie ihre Unterklasse erstellen können.

public class DemoDbContext : DbContext {
    public DbSet<Person> Person { get; set; }
    public DbSet<Author> Authors { get; set; }
}

public class Person {
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Author : Person {
    public string SubjectArea { get; set; }
}

Tabelle pro Hierarchie (TPH)

Beim Vererbungstyp Tabelle pro Hierarchie (TPH) (dies ist der Standardvererbungstyp in EF Core) hätten Sie nur eine Tabelle für die gesamte Hierarchie, um alle Klassen darzustellen. Um zwischen verschiedenen Typen zu unterscheiden, wird eine „Diskriminator“-Spalte verwendet. Standardmäßig wird die Tabelle nach der Basisklasse oder einem damit verknüpften DbSet-Feld benannt. Der Name der Tabelle wäre standardmäßig der Name der Basisklasse oder ihres entsprechenden DbSet-Attributs.

Das folgende Code-Snippet veranschaulicht, wie Tabelle pro Hierarchie dargestellt werden kann:

public abstract class Person {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public class User : Person {
        public string UserName { get; set; }
        public string Password { get; set; }
    }

    public class Manager : Person {
        public string Department { get; set; }
    }

Tabelle pro Typ (TPT)

Vererbungsbeziehungen des Table Per Type (TPT)-Ansatzes werden als Fremdschlüssel dargestellt. Bei diesem Ansatz stellt eine separate Tabelle jeden Typ (einschließlich abstrakter Typen) der Vererbungskette dar. Die Fremdschlüssel werden verwendet, um Tabellen, die abgeleitete Typtypen darstellen, mit ihrem Basistyp zu verknüpfen. Bei dieser Strategie erstellt EF Core eine Basistabelle in der Datenbank und mehrere Tabellen, die für jeden abgeleiteten Typ spezifisch sind.

Das folgende Code-Listing zeigt, wie der Table Per Type (TPT)-Ansatz implementiert werden kann:

public abstract class Person {
    public int Id { get; set; }
    public string FullName { get; set; }
}

[Table("Users")]
public class User : Person {
     public string UserName { get; set; }
     public string Password { get; set; }
}

[Table("Managers")]
public class Manager : Person {
     public string Department { get; set; }
}

Tabelle pro Betontyp (TPC)

Bei dem Ansatz Tabelle pro konkretem Typ (TPC) wird jeder konkrete Typ in der Vererbungskette durch eine eigene Tabelle in der Datenbank dargestellt, aber nicht durch die abstrakte Klasse. Eigenschaften eines beliebigen abstrakten Basistyps werden als Felder in der Tabelle jedes konkreten Typs erstellt.

Das Klassendesign entspricht dem von TPH. So können Sie für jede der Unterklassen eine Tabelle angeben:

public class MyDbContext : DbContext {
    public DbSet<Person> Person { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<User>().Map(m => {
            m.MapInheritedProperties();
            m.ToTable("Users");
        });

        modelBuilder.Entity<Author>().Map(m => {
            m.MapInheritedProperties();
            m.ToTable("Managers");
        });
    }
}

Zusammenfassung

Entity Framework Core kann auf jeder Plattform ausgeführt werden, die .NET Standard 2.1 unterstützt. Dies umfasst sowohl .NET Core 3.1 als auch .NET 5. Es wird jedoch nicht auf .NET Standard 2.0 ausgeführt, was bedeutet, dass Sie ab EF Core 5.0 EF Core nicht mit .NET Framework nutzen können. Viel Spaß beim Lesen!