Beispieldaten für ein EDM generieren

Im Artikel “Beispieldaten generieren mit Bogus” haben wir gezeigt, wie Sie grundsätzlich Beispieldaten mit der Erweiterung Bogus erzeugen. Dort haben wir allerdings noch offen gelassen, wie Sie solche Daten erzeugen, die in verknüpften Tabellen gespeichert werden sollen – also beispielsweise in zwei Tabellen namens “Kunden” und “Bestellungen”, wobei die Tabelle “Bestellungen” über ein Fremdschlüsselfeld namens “KundeID” mit der Tabelle “Kunden” verknüpft ist. Wie das gelingt, und welche Techniken noch interessant sind für das Schreiben von Beispieldaten über ein Entity Data Model direkt in die zugrunde liegenden Tabellen, beschreiben wir im vorliegenden Artikel.

Beispielprojekt erstellen

Wir erstellen ein einfaches Beispielprojekt des Typs WPF-App (für Visual Basic) namens BeispieldatenGenerieren. Diesem fügen wir ein Entity Data Model hinzu, das wir BeispieldatenContext nennen (Menüeintrag Projekt|Neues Element hinzufügen…) und das den Typ Leeres Code First-Modell erhalten soll. Für dieses Projekt legen wir als Erstes eine Klasse namens Kunde an, die wie folgt aussieht:

Partial Public Class Kunde
     Public Overridable Property ID As Int32
     Public Overridable Property Vorname As String
     Public Overridable Property Nachname As String
     Public Overridable Property Firma As String
     Public Overridable Property Strasse As String
     Public Overridable Property PLZ As String
     Public Overridable Property Ort As String
     Public Overridable Property Land As String
     Public Overridable Property EMail As String
End Class

Außerdem fügen wir eine Klasse namens Bestellung hinzu:

Partial Public Class Bestellung
     Public Overridable Property ID As Int32
     Public Overridable Property Bestelldatum As DateTime
     Public Overridable Property Kunde As Kunde
End Class

Damit wir auch eine m:n-Beziehung abbilden können, legen wir noch eine Klasse Produkt und eine Klasse Bestellpositionen an:

Partial Public Class Bestellposition
     Public Overridable Property ID As Int32
     Public Overridable Property ProduktID As Int32
     Public Overridable Property BestellungID As Int32
     Public Overridable Property Produkt As Produkt
     Public Overridable Property Bestellung As Bestellung
     Public Overridable Property Einzelpreis As Decimal
     Public Overridable Property Menge As Int32
End Class
Partial Public Class Produkt
     Public Overridable Property ID As Int32
     Public Overridable Property Produktname As String
     Public Overridable Property Einzelpreis As Decimal
     Public Overridable Property Bestellpositionen As ICollection(Of Bestellposition)
End Class

Der Klasse BeispieldatenContext.vb fügen wir eine DbSet-Definition für die vorgestellten Klasse hinzu. Außerdem legen wir in der Konstruktor-Methode New fest, dass die noch zu definierende Klasse BeispieldatenInitializer zum Initialisieren der Datenbank verwendet werden soll:

Public Class BeispieldatenContext
     Inherits DbContext
     Public Sub New()
         MyBase.New("name=BeispieldatenContext")
         Database.SetInitializer(New BeispieldatenInitializer())
     End Sub
     Public Overridable Property Kunden() As DbSet(Of Kunde)
     Public Overridable Property Bestellungen() As DbSet(Of Bestellung)
     Public Overridable Property Produkte() As DbSet(Of Produkt)
     Public Overridable Property Bestellpositionen() As DbSet(Of Bestellposition)
End Class

Schließlich legen wir hier noch fest, dass die Elemente der Klassen Kunde, Bestellung, Bestellposition und Produkt in den Tabellen Kunden, Bestellungen, Bestellpositionen und Produkte landen sollen:

Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
     MyBase.OnModelCreating(modelBuilder)
     modelBuilder.Entity(Of Kunde)().ToTable("Kunden")
     modelBuilder.Entity(Of Bestellung)().ToTable("Bestellungen")
     modelBuilder.Entity(Of Bestellposition)().ToTable("Bestellpositionen")
     modelBuilder.Entity(Of Produkt)().ToTable("Produkte")
End Sub

Bogus zum Projekt hinzufügen

Danach fügen wir das Bogus-Paket zum Projekt hinzu. Dazu wählen Sie den Menüeintrag Projekt|NuGet-Pakete verwalten aus. Dies öffnet ein neues Fenster, indem Sie zum Bereich Durchsuchen wechseln. Hier geben Sie im Suchfeld den Text Bogus ein und finden gleich das passende Paket von Brian Chavez vor.

Markieren Sie dieses und starten die Installation mit einem Klick auf die Schaltfläche Installieren (siehe Bild 1).

Hinzufügen des Pakets Bogus

Bild 1: Hinzufügen des Pakets Bogus

Kundentabelle mit Bogus füllen

Danach starten wir direkt mit der Anwendung. Wir wollen erst einmal nur Daten in der Tabelle Kunden anlegen. Dazu fügen wir der Datenbank-Initialisierer-Klasse Beispieldateninitialisierer wie folgt eine Seed-Methode hinzu:

Public Class BeispieldatenInitializer
     Inherits DropCreateDatabaseAlways(Of BeispieldatenContext)
     Protected Overrides Sub Seed(context As BeispieldatenContext)
         Dim Kunden As List(Of Kunde) = New List(Of Kunde)
         Dim objFaker As Bogus.Faker(Of Kunde) = New Bogus.Faker(Of Kunde)("de")
         objFaker.Rules(Function(f, k) As Object
                            k.Vorname = f.Name.FirstName
                            k.Nachname = f.Name.LastName
                            k.Firma = f.Company.CompanyName
                            k.Strasse = f.Address.StreetAddress
                            k.PLZ = f.Address.ZipCode
                            k.Ort = f.Address.City
                            k.Land = "Deutschland"
                            k.EMail = f.Internet.Email
                        End Function)
         Kunden = objFaker.Generate(1000)
         context.Kunden.AddRange(Kunden)
         MyBase.Seed(context)
     End Sub
End Class

Die Seed-Methode deklariert und initialisiert ein List-Objekt namens Kunden für Elemente des Typs Kunde. Dann erstellt sie ein sogenanntes Faker-Objekt namens objFaker, mit dem wir Elemente des Typs Kunde füllen wollen. Damit diese später beispielsweise deutsche Adressdaten verwendet und keine amerikanischen, hängen wir noch den Parameter (“de”) an.

Danach legen wir mit der Methode Rules die Regeln fest, nach denen neue Elemente mit Daten gefüllt werden sollen. Als Parameter für die Rules-Methode geben wir einen Function-Lambda-Ausdruck an. Dieser enthält die Zuweisungen der verschiedenen Klassen und Funktionen von Bogus (f) zu den Eigenschaften des zu erzeugenden Elements (k).

Die Eigenschaft Vorname füllen wir beispielsweise mit der Funktion FirstName der Name-Klasse. Wir möchten nur Kunden mit deutscher Adresse hinzufügen, also stellen wir für das Feld Land fix den Wert Deutschland ein. Nachdem wir die Zuweisung für alle Eigenschaften erstellt haben, rufen wir die Generate-Methode des Objekts aus objFaker auf und übergeben dieser als Parameter die Anzahl der zu erstellenden Elemente und weisen diese dem List-Objekt Kunden zu.

Diese Liste schreiben wir schließlich mit der AddRange-Methode in das DbSet-Element Kunden. Damit die Daten noch in die zugrunde liegende Tabelle der Datenbank geschrieben werden, rufen wir schließlich noch die Seed-Methode für den Datenbankkontext aus context auf.

Daten beim Start der Anwendung erstellen

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins DATENBANKENTWICKLER:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar