Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Im Artikel “EDM: Der Code First-Ansatz” haben wir gezeigt, wie Sie unter Nutzung des Entity Frameworks ein Datenmodell per Klassenmodell programmieren und dann mit ein paar Befehlen dafür sorgen, dass die Klassen in Form eines Datenmodells in einer Datenbank umgesetzt werden. Im vorliegenden Artikel schauen wir uns nun im Detail an, wie Sie 1:n-Beziehungen mit Code First definieren, die dann in die Zieldatenbank übertragen werden.
Vorbereitungen
Für diesen Artikel nutzen wir ein Projekt auf Basis der Vorlage Visual C#|Windows Desktop|WPF-App namens CustomerManagement. Die Techniken lassen sich aber auch in Projekten auf Basis anderer Vorlagen nutzen, beispielsweise in Webanwendungen.
Fügen Sie dem Projekt ein ADO.NET Entity Data Model hinzu.
- Dazu betätigen Sie den Kontextmenü-Eintrag Hinzufügen|Neues Element des Projekt-Eintrags im Projektmappen-Explorer.
- Im nun erscheinenden Dialog Neues Element hinzufügen wählen Sie den Eintrag ADO.NET Entity Data Model aus. Das Element benennen wir mit CustomerManagementContext.
- Wählen Sie im folgenden Dialog die Option Leeres Code First-Modell aus.
Damit erstellt der Assistent nun eine neue Klasse namens CustomerManagementContext.cs, die ein paar auskommentierte Beispielanweisungen enthält. Außerdem finden Sie in der Datei App.conf ein Element namens connectionStrings. Hier passen wir den Namen der zu erstellenden Datenbank mit dem Attribut initial catalog auf CustomerManagement an:
<connectionStrings> <add name="CustomerManagementContext" connectionString="data source=(LocalDb)\MSSQLLocalDB; initial catalog=CustomerManagement;integrated security=True;MultipleActiveResultSets=True; App=EntityFramework" providerName="System.Data.SqlClient" /> </connectionStrings>
Dadurch wird die Datenbank beim Erstellen CustomerManagement benannt.
Beispiel
Unser einfaches Beispiel soll eine Klasse namens Customer und eine namens Salutation enthalten und daraus die Tabellen Customers und Salutations erzeugen, die über ein Feld SalutationID der Tabelle Customers und das gleichnamige Feld der Tabelle Salutations miteinander verknüpft sind.
Klassen erstellen und DbContext einrichten
Zur Erinnerung: Wir können die einzelnen Klassen direkt in der Klassendatei CustomerManagementContext.cs unterbringen, aber auch in jeweils einer eigenen Datei. In letzterem Fall würden wir die Klassen aus Gründen der Übersicht in einem Unterverzeichnis namens Model anlegen. Dieses Verzeichnis fügen wir über den Kontextmenü-Eintrag Hinzufügen|Neuer Ordner zum Projektordner hinzu. Dann legen wir darin eine neue Klassendatei namens Customer.cs an. Dadurch wird für diese Klasse automatisch der Namespace CustomerManagement.Models festgelegt, was wir später noch berücksichtigen müssen. Wir ändern die Sichtbarkeit der Klasse auf öffentlich (public) und fügen ein paar Felder hinzu – unter anderem ein Feld namens ID, das später als Primärschlüsselfeld verwendet werden soll und eines namens SalutationID, das als Fremdschlüsselfeld zur Tabelle Salutations zum Einsatz kommt:
namespace CustomerManagement.Models { public class Customer { public int ID { get; set; } public string Company { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int SalutationID { get; set; } } }
Auf die gleiche Weise erzeugen wir eine Klasse für die Anreden, die wir Salutation nennen. Auch diese legen wir im Verzeichnis Models an und stellen die Sichtbarkeit auf öffentlich ein. Dieses Klasse soll die Felder ID und Name erhalten:
namespace CustomerManagement.Models { public class Salutation { public int ID { get; set; } public string Name { get; set; } } }
Nun müssen wir noch die DbSet-Elemente in der Klasse CustomerManagementContext hinzufügen. Damit wir dabei auf die Klassen Customer und Salutation als Datentypen der Auflistungen zugreifen können, machen wir den Namespace CustomerManagement.Models mit der using-Anweisung verfügbar:
namespace CustomerManagement { ... using CustomerManagement.Models;
Dann folgt die eigentliche Klasse mit dem zunächst leeren Konstruktor: