{"id":55000289,"date":"2021-10-01T00:00:00","date_gmt":"2022-02-15T13:17:16","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=289"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Beispieldaten_fuer_ein_EDM_generieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Beispieldaten_fuer_ein_EDM_generieren\/","title":{"rendered":"Beispieldaten f&uuml;r ein EDM generieren"},"content":{"rendered":"<p><b>Im Artikel &#8220;Beispieldaten generieren mit Bogus&#8221; haben  wir gezeigt, wie Sie grunds&auml;tzlich Beispieldaten mit der Erweiterung Bogus erzeugen. Dort haben wir allerdings noch offen gelassen, wie Sie solche Daten erzeugen, die in verkn&uuml;pften Tabellen gespeichert werden sollen &#8211; also beispielsweise in zwei Tabellen namens &#8220;Kunden&#8221; und &#8220;Bestellungen&#8221;, wobei die Tabelle &#8220;Bestellungen&#8221; &uuml;ber ein Fremdschl&uuml;sselfeld namens &#8220;KundeID&#8221; mit der Tabelle &#8220;Kunden&#8221; verkn&uuml;pft ist. Wie das gelingt, und welche Techniken noch interessant sind f&uuml;r das Schreiben von Beispieldaten &uuml;ber ein Entity Data Model direkt in die zugrunde liegenden Tabellen, beschreiben wir im vorliegenden Artikel.<\/b><\/p>\n<h2>Beispielprojekt erstellen<\/h2>\n<p>Wir erstellen ein einfaches Beispielprojekt des Typs <b>WPF-App <\/b>(f&uuml;r <b>Visual Basic<\/b>) namens <b>BeispieldatenGenerieren<\/b>. Diesem f&uuml;gen wir ein Entity Data Model hinzu, das wir <b>BeispieldatenContext <\/b>nennen (Men&uuml;eintrag <b>Projekt|Neues Element hinzuf&uuml;gen&#8230;<\/b>) und das den Typ <b>Leeres Code First-Modell <\/b>erhalten soll. F&uuml;r dieses Projekt legen wir als Erstes eine Klasse namens <b>Kunde <\/b>an, die wie folgt aussieht:<\/p>\n<pre>Partial Public Class Kunde\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property ID<span style=\"color:blue;\"> As <\/span>Int32\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Vorname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Nachname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Firma<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Strasse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property PLZ<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Ort<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Land<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property EMail<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Au&szlig;erdem f&uuml;gen wir eine Klasse namens <b>Bestellung <\/b>hinzu:<\/p>\n<pre>Partial Public Class Bestellung\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property ID<span style=\"color:blue;\"> As <\/span>Int32\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Bestelldatum<span style=\"color:blue;\"> As Date<\/span>Time\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Kunde<span style=\"color:blue;\"> As <\/span>Kunde\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Damit wir auch eine m:n-Beziehung abbilden k&ouml;nnen, legen wir noch eine Klasse <b>Produkt <\/b>und eine Klasse <b>Bestellpositionen <\/b>an:<\/p>\n<pre>Partial Public Class Bestellposition\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property ID<span style=\"color:blue;\"> As <\/span>Int32\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property ProduktID<span style=\"color:blue;\"> As <\/span>Int32\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property BestellungID<span style=\"color:blue;\"> As <\/span>Int32\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Produkt<span style=\"color:blue;\"> As <\/span>Produkt\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Bestellung<span style=\"color:blue;\"> As <\/span>Bestellung\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Einzelpreis<span style=\"color:blue;\"> As Decimal<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Menge<span style=\"color:blue;\"> As <\/span>Int32\r\n<span style=\"color:blue;\">End Class<\/span>\r\nPartial Public Class Produkt\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property ID<span style=\"color:blue;\"> As <\/span>Int32\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Produktname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Einzelpreis<span style=\"color:blue;\"> As Decimal<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Bestellpositionen<span style=\"color:blue;\"> As <\/span>ICollection(Of Bestellposition)\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Der Klasse <b>BeispieldatenContext.vb <\/b>f&uuml;gen wir eine <b>DbSet<\/b>-Definition f&uuml;r die vorgestellten Klasse hinzu. Au&szlig;erdem legen wir in der Konstruktor-Methode <b>New <\/b>fest, dass die noch zu definierende Klasse <b>BeispieldatenInitializer <\/b>zum Initialisieren der Datenbank verwendet werden soll:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> BeispieldatenContext\r\n     Inherits DbContext\r\n     <span style=\"color:blue;\">Public <\/span>Sub New()\r\n         MyBase.New(\"name=BeispieldatenContext\")\r\n         Database.SetInitializer(<span style=\"color:blue;\">New<\/span> BeispieldatenInitializer())\r\n     End Sub\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Kunden()<span style=\"color:blue;\"> As <\/span>DbSet(Of Kunde)\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Bestellungen()<span style=\"color:blue;\"> As <\/span>DbSet(Of Bestellung)\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Produkte()<span style=\"color:blue;\"> As <\/span>DbSet(Of Produkt)\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Bestellpositionen()<span style=\"color:blue;\"> As <\/span>DbSet(Of Bestellposition)\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Schlie&szlig;lich legen wir hier noch fest, dass die Elemente der Klassen <b>Kunde<\/b>, <b>Bestellung<\/b>, <b>Bestellposition <\/b>und <b>Produkt <\/b>in den Tabellen <b>Kunden<\/b>, <b>Bestellungen<\/b>, <b>Bestellpositionen <\/b>und <b>Produkte <\/b>landen sollen:<\/p>\n<pre>Protected Overrides Sub OnModelCreating(modelBuilder<span style=\"color:blue;\"> As <\/span>DbModelBuilder)\r\n     MyBase.OnModelCreating(modelBuilder)\r\n     modelBuilder.Entity(Of Kunde)().ToTable(\"Kunden\")\r\n     modelBuilder.Entity(Of Bestellung)().ToTable(\"Bestellungen\")\r\n     modelBuilder.Entity(Of Bestellposition)().ToTable(\"Bestellpositionen\")\r\n     modelBuilder.Entity(Of Produkt)().ToTable(\"Produkte\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Bogus zum Projekt hinzuf&uuml;gen<\/h2>\n<p>Danach f&uuml;gen wir das Bogus-Paket zum Projekt hinzu. Dazu w&auml;hlen Sie den Men&uuml;eintrag <b>Projekt|NuGet-Pakete verwalten <\/b>aus. Dies &ouml;ffnet ein neues Fenster, indem Sie zum Bereich <b>Durchsuchen <\/b>wechseln. Hier geben Sie im Suchfeld den Text <b>Bogus <\/b>ein und finden gleich das passende Paket von <b>Brian Chavez <\/b>vor.<\/p>\n<p>Markieren Sie dieses und starten die Installation mit einem Klick auf die Schaltfl&auml;che <b>Installieren<\/b> (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_05\/pic_289_001.png\" alt=\"Hinzuf&uuml;gen des Pakets Bogus\" width=\"700\" height=\"302,2577\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Hinzuf&uuml;gen des Pakets Bogus<\/span><\/b><\/p>\n<h2>Kundentabelle mit Bogus f&uuml;llen<\/h2>\n<p>Danach starten wir direkt mit der Anwendung. Wir wollen erst einmal nur Daten in der Tabelle <b>Kunden <\/b>anlegen. Dazu f&uuml;gen wir der Datenbank-Initialisierer-Klasse <b>Beispieldateninitialisierer <\/b>wie folgt eine <b>Seed<\/b>-Methode hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> BeispieldatenInitializer\r\n     Inherits DropCreateDatabaseAlways(Of BeispieldatenContext)\r\n     Protected Overrides Sub Seed(context<span style=\"color:blue;\"> As <\/span>BeispieldatenContext)\r\n         <span style=\"color:blue;\">Dim <\/span>Kunden<span style=\"color:blue;\"> As <\/span>List(Of Kunde) = <span style=\"color:blue;\">New<\/span> List(Of Kunde)\r\n         <span style=\"color:blue;\">Dim <\/span>objFaker<span style=\"color:blue;\"> As <\/span>Bogus.Faker(Of Kunde) = <span style=\"color:blue;\">New<\/span> Bogus.Faker(Of Kunde)(\"de\")\r\n         objFaker.Rules(Function(f, k)<span style=\"color:blue;\"> As Object<\/span>\r\n                            k.Vorname = f.Name.FirstName\r\n                            k.Nachname = f.Name.LastName\r\n                            k.Firma = f.Company.CompanyName\r\n                            k.Strasse = f.Address.StreetAddress\r\n                            k.PLZ = f.Address.ZipCode\r\n                            k.Ort = f.Address.City\r\n                            k.Land = \"Deutschland\"\r\n                            k.EMail = f.Internet.Email\r\n                        End Function)\r\n         Kunden = objFaker.Generate(1000)\r\n         context.Kunden.AddRange(Kunden)\r\n         MyBase.Seed(context)\r\n     End Sub\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Die <b>Seed<\/b>-Methode deklariert und initialisiert ein <b>List<\/b>-Objekt namens <b>Kunden <\/b>f&uuml;r Elemente des Typs <b>Kunde<\/b>. Dann erstellt sie ein sogenanntes <b>Faker<\/b>-Objekt namens <b>objFaker<\/b>, mit dem wir Elemente des Typs <b>Kunde <\/b>f&uuml;llen wollen. Damit diese sp&auml;ter beispielsweise deutsche Adressdaten verwendet und keine amerikanischen, h&auml;ngen wir noch den Parameter <b>(&#8220;de&#8221;) <\/b>an.<\/p>\n<p>Danach legen wir mit der Methode <b>Rules <\/b>die Regeln fest, nach denen neue Elemente mit Daten gef&uuml;llt werden sollen. Als Parameter f&uuml;r die <b>Rules<\/b>-Methode geben wir einen <b>Function<\/b>-Lambda-Ausdruck an. Dieser enth&auml;lt die Zuweisungen der verschiedenen Klassen und Funktionen von Bogus (<b>f<\/b>)  zu den Eigenschaften des zu erzeugenden Elements (<b>k<\/b>).<\/p>\n<p>Die Eigenschaft <b>Vorname <\/b>f&uuml;llen wir beispielsweise mit der Funktion <b>FirstName <\/b>der <b>Name<\/b>-Klasse. Wir m&ouml;chten nur Kunden mit deutscher Adresse hinzuf&uuml;gen, also stellen wir f&uuml;r das Feld <b>Land <\/b>fix den Wert <b>Deutschland <\/b>ein. Nachdem wir die Zuweisung f&uuml;r alle Eigenschaften erstellt haben, rufen wir die <b>Generate<\/b>-Methode des Objekts aus <b>objFaker <\/b>auf und &uuml;bergeben dieser als Parameter die Anzahl der zu erstellenden Elemente und weisen diese dem <b>List<\/b>-Objekt <b>Kunden <\/b>zu.<\/p>\n<p>Diese Liste schreiben wir schlie&szlig;lich mit der <b>AddRange<\/b>-Methode in das <b>DbSet<\/b>-Element <b>Kunden<\/b>. Damit die Daten noch in die zugrunde liegende Tabelle der Datenbank geschrieben werden, rufen wir schlie&szlig;lich noch die <b>Seed<\/b>-Methode f&uuml;r den Datenbankkontext aus <b>context <\/b>auf.<\/p>\n<h2>Daten beim Start der Anwendung erstellen<\/h2>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000\"><a style=\"color: #ff0000\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000289\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000289?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000289\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"495fc102af\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Artikel &#8220;Beispieldaten generieren mit Bogus&#8221; haben  wir gezeigt, wie Sie grunds&auml;tzlich Beispieldaten mit der Erweiterung Bogus erzeugen. Dort haben wir allerdings noch offen gelassen, wie Sie solche Daten erzeugen, die in verkn&uuml;pften Tabellen gespeichert werden sollen &#8211; also beispielsweise in zwei Tabellen namens &#8220;Kunden&#8221; und &#8220;Bestellungen&#8221;, wobei die Tabelle &#8220;Bestellungen&#8221; &uuml;ber ein Fremdschl&uuml;sselfeld namens &#8220;KundeID&#8221; mit der Tabelle &#8220;Kunden&#8221; verkn&uuml;pft ist. Wie das gelingt, und welche Techniken noch interessant sind f&uuml;r das Schreiben von Beispieldaten &uuml;ber ein Entity Data Model direkt in die zugrunde liegenden Tabellen, beschreiben wir im vorliegenden Artikel.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662021,66052021,44000008,44000025],"tags":[],"yst_prominent_words":[],"class_list":["post-55000289","post","type-post","status-publish","format-standard","hentry","category-662021","category-66052021","category-Datenzugriffstechnik","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000289","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000289"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000289\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000289"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}