Code First Mapping per DataAnnotation

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Wenn Sie ein Code First-Entity Data Model entwerfen, gibt es bestimmte Konventionen, die standardmäßig greifen. So heißen Entitäten wie der Singular der zugrunde liegenden Tabellennamen oder der Primär- und Fremdschlüssel werden aus Feldern abgeleitet, welche die Zeichenkette ID enthalten – gegebenenfalls kombiniert mit dem Entitätsnamen. Wenn Sie mit einem Datenmodell daherkommen, dessen Tabellen das Präfix “tbl” mitbringen, wollen Sie dieses nicht in den Entitätsnamen wiederfinden und gegebenenfalls möchten (oder müssen) Sie auch noch Feldnamen ändern und diese anschließend mappen. Eine Möglichkeit dazu bieten die DataAnnotations, die wir in diesem Artikel beschreiben.

Im Artikel Code First Mapping per Fluent API (www.datenbankentwickler.net/252) haben wir gezeigt, wie Sie die Entitätsklassen eines Entity Data Models auf die Tabellen eines Datenmodells einer SQL Server-Datenbank mappen können beziehungsweise wie Sie dafür sorgen können, dass die Tabellen, Felder und Beziehungen der Tabellen beim Erstellen einer neuen Datenbank auf Basis von Code First nach Ihren Wünschen erstellt werden können. Dabei haben wir ausschließlich die Methoden der Fluent API verwendet, die in einer speziellen Methode namens OnModelCreating angelegt werden. Im vorliegenden Artikel wollen wir eine Alternative dazu vorstellen, nämlich die DataAnnotations. Dabei handelt es sich um “Anmerkungen”, die direkt in die jeweiligen Entitätsklassen eingetragen werden. Im Gegensatz zu den Methoden, die wir mit der Fluent API in der Methode OnModelCreating hinterlegen, landen die DataAnnotations unmittelbar bei den betroffenen Klassen und Eigenschaften. Wir wollen versuchen, die Mapping-Eigenschaften, die wir im oben genannten Artikel mit der Fluent API vorgenommen haben, mit den DataAnnotations zu reproduzieren. Wir verwenden also die gleichen Entitätsklassen und wollen das gleiche Datenmodell daraus erstellen beziehungsweise mappen wie in diesem Artikel.

Erstellen versus Mapping

In den Beispielen dieses Artikels, in denen wir die Anpassungen von Entity Data Model zu den Tabellen des zu erzeugenden Datenmodells Schritt für Schritt anpassen, erstellen wir die Datenbank einmal neu und führen die nachfolgend beschriebenen Änderungen Schritt für Schritt aus. Das erledigen wir mit drei Methoden, die wir über die Paket-Manager-Konsole absetzen. Diese Methoden lauten:

  • Enable-Migration: Aktiviert die Migrationen für das Entity Data Model. Dieser Schritt ist nur einmal vor dem ersten Aufruf der nachfolgend beschriebenen Anweisung Add-Migration notwendig.
  • Add-Migration : Fügt eine neue Migration hinzu. Beim ersten Aufruf wird dabei eine Klasse erstellt, die Methoden mit allen Befehlen enthält, um die Datenbank und die enthaltenen Tabellen samt Feldern, Indizes und Beziehungen zu erstellen. Bei Aufrufen nach Änderungen am Entity Data Modell werden zu der jeweils neu erstellten Klasse nur Methoden mit Befehlen hinzugefügt, die für das Anwenden der Änderungen notwendig sind. Die Klassen und die enthaltenen Methoden und Befehle werden durch die nachfolgend vorgestellte Anweisung angewendet.
  • Update-Database: Erstellt die Datenbank beziehungsweise nimmt die Änderungen vor, die durch Add-Migration hinzugefügt wurden.

Beispielprojekt für DataAnnotations

Das Beispielprojekt setzen wir als WPF-App für das .NET Framework mit Visual Basic auf. Diesem fügen wir ein neues Element des Typs ADO.NET Entity Data Model namens DataAnnotationContext hinzu. Im Dialog Modellinhalt auswählen selektieren wir Leeres Code First-Modell. Dies fügt die Klasse DataAnnotationContext.vb, einige Verweise und Informationen über das Entity Framework und die Verbindungszeichenfolge zur Datei App.config hinzu. Normalerweise beziehen sich diese auf eine Datenbank, die den gleichen Namen wie das Projekt plus einem Punkt plus dem Namen der Context-Klasse hat und die mit der aktuellen SQL Server LocalDb-Instanz verwaltet wird.

Entitätsklassen hinzufügen

Zu Beispielzwecken benötigen wir die gleichen Klassen wie im oben genannten Artikel. Diese heißen Person.vb und Anrede.vb sowie Fahrzeug.vb und Ausstattungsmerkmal.vb. Wie diese aussehen, entnehmen Sie dem Beispielprojekt, eine Beschreibung finden Sie im oben genannten Artikel. Wichtig ist: Zwischen Person.vb und Anrede.vb gibt es eine 1:n-Beziehung, zwischen Fahrzeug.vb und Ausstattungsmerkmal.vb eine m:n-Beziehung.

DbSet-Elemente hinzufügen

Damit der Aufruf der Anweisung Add-Migration überhaupt Anweisungen zum Erstellen von Tabellen in eine neue Klasse schreibt, benötigt sie Informationen darüber, welche Tabellen erstellt werden sollen. Diese Information hinterlegen wir in Form von DbSet-Deklarationen in der Klasse DataAnnotationContext.vb:

Public Overridable Property Anreden As DbSet(Of Anrede)
Public Overridable Property Personen As DbSet(Of Person)
Public Overridable Property Fahrzeuge As DbSet(Of Fahrzeug)
Public Overridable Property Ausstattungsmerkmale As DbSet(Of Ausstattungsmerkmal)

Erste Migration

Damit können wir die erste Migration durchführen und rufen die Befehle Enable-Migrations (erstellt den Ordner Migrations mit der Datei Configuration.vb) und Add-Migration init auf. Anschließend erstellen wir mit Update-Database eine Datenbank auf Basis der in der soeben erstellten Datei, deren Dateiname auf _init.vb endet. Wenn Sie mit dem Menübefehl Ansicht|SQL Server-Objekt-Explorer den Bereich SQL Server-Objekt-Explorer aktivieren, können Sie hier eine Verbindung mit der in der Verbindungszeichenfolge angegebenen SQL Server-Instanz herstellen und sich die Datenbank mit ihren Tabellen anzeigen lassen. Diese zeigt nicht nur die vier Tabellen für die von uns hinzugefügten Entitätsklassen an, sondern auch noch eine Verknüpfungstabelle zum Herstellen der Beziehung zwischen den beiden Klassen Fahrzeug und Ausstattungsmerkmal.

 

Schreibe einen Kommentar