{"id":55000137,"date":"2018-08-01T00:00:00","date_gmt":"2020-03-27T19:32:49","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=137"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"EDM_1nBeziehungen_per_Code_First","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/EDM_1nBeziehungen_per_Code_First\/","title":{"rendered":"EDM: 1:n-Beziehungen per Code First"},"content":{"rendered":"<p><b>Im Artikel &#8220;EDM: Der Code First-Ansatz&#8221; haben wir gezeigt, wie Sie unter Nutzung des Entity Frameworks ein Datenmodell per Klassenmodell programmieren und dann mit ein paar Befehlen daf&uuml;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 &uuml;bertragen werden.<\/b><\/p>\n<h2>Vorbereitungen<\/h2>\n<p>F&uuml;r diesen Artikel nutzen wir ein Projekt auf Basis der Vorlage <b>Visual C#|Windows Desktop|WPF-App<\/b> namens <b>CustomerManagement<\/b>. Die Techniken lassen sich aber auch in Projekten auf Basis anderer Vorlagen nutzen, beispielsweise in Webanwendungen. <\/p>\n<p>F&uuml;gen Sie dem Projekt ein ADO.NET Entity Data Model hinzu.<\/p>\n<ul>\n<li>Dazu bet&auml;tigen Sie den Kontextmen&uuml;-Eintrag <b>Hinzuf&uuml;gen|Neues Element <\/b>des Projekt-Eintrags im Projektmappen-Explorer.<\/li>\n<li>Im nun erscheinenden Dialog <b>Neues Element hinzuf&uuml;gen <\/b>w&auml;hlen Sie den Eintrag <b>ADO.NET Entity Data Model <\/b>aus. Das Element benennen wir mit <b>CustomerManagementContext<\/b>.<\/li>\n<li>W&auml;hlen Sie im folgenden Dialog die Option <b>Leeres Code First-Modell <\/b>aus.<\/li>\n<\/ul>\n<p>Damit erstellt der Assistent nun eine neue Klasse namens <b>CustomerManagementContext.cs<\/b>, die ein paar auskommentierte Beispielanweisungen enth&auml;lt. Au&szlig;erdem finden Sie in der Datei <b>App.conf <\/b>ein Element namens <b>connectionStrings<\/b>. Hier passen wir den Namen der zu erstellenden Datenbank mit dem Attribut <b>initial catalog <\/b>auf <b>CustomerManagement <\/b>an:<\/p>\n<pre>&lt;connectionStrings&gt;\r\n   &lt;add name=\"CustomerManagementContext\" connectionString=\"data source=(LocalDb)\\MSSQLLocalDB;               initial catalog=CustomerManagement;integrated security=True;MultipleActiveResultSets=True;               App=EntityFramework\" providerName=\"System.Data.SqlClient\" \/&gt;\r\n&lt;\/connectionStrings&gt;<\/pre>\n<p>Dadurch wird die Datenbank beim Erstellen CustomerManagement benannt.<\/p>\n<h2>Beispiel<\/h2>\n<p>Unser einfaches Beispiel soll eine Klasse namens <b>Customer <\/b>und eine namens <b>Salutation <\/b>enthalten und daraus die Tabellen <b>Customers <\/b>und <b>Salutations <\/b>erzeugen, die &uuml;ber ein Feld <b>SalutationID <\/b>der Tabelle <b>Customers <\/b>und das gleichnamige Feld der Tabelle <b>Salutations <\/b>miteinander verkn&uuml;pft sind.<\/p>\n<h2>Klassen erstellen und DbContext einrichten<\/h2>\n<p>Zur Erinnerung: Wir k&ouml;nnen die einzelnen Klassen direkt in der Klassendatei <b>CustomerManagementContext.cs <\/b>unterbringen, aber auch in jeweils einer eigenen Datei. In letzterem Fall w&uuml;rden wir die Klassen aus Gr&uuml;nden der &Uuml;bersicht in einem Unterverzeichnis namens <b>Model <\/b>anlegen. Dieses Verzeichnis f&uuml;gen wir &uuml;ber den Kontextmen&uuml;-Eintrag <b>Hinzuf&uuml;gen|Neuer Ordner <\/b>zum Projektordner hinzu. Dann legen wir darin eine neue Klassendatei namens <b>Customer.cs <\/b>an. Dadurch wird f&uuml;r diese Klasse automatisch der Namespace <b>CustomerManagement.Models <\/b>festgelegt, was wir sp&auml;ter noch ber&uuml;cksichtigen m&uuml;ssen. Wir &auml;ndern die Sichtbarkeit der Klasse auf &ouml;ffentlich (<b>public<\/b>) und f&uuml;gen ein paar Felder hinzu &#8211; unter anderem ein Feld namens <b>ID<\/b>, das sp&auml;ter als Prim&auml;rschl&uuml;sselfeld verwendet werden soll und eines namens <b>SalutationID<\/b>, das als Fremdschl&uuml;sselfeld zur Tabelle <b>Salutations <\/b>zum Einsatz kommt:<\/p>\n<pre>namespace CustomerManagement.Models {\r\n     public class Customer {\r\n         public int ID { get; set; }\r\n         public string Company { get; set; }\r\n         public string FirstName { get; set; }\r\n         public string LastName { get; set; }\r\n         public int SalutationID { get; set; }\r\n     }\r\n}<\/pre>\n<p>Auf die gleiche Weise erzeugen wir eine Klasse f&uuml;r die Anreden, die wir Salutation nennen. Auch diese legen wir im Verzeichnis <b>Models <\/b>an und stellen die Sichtbarkeit auf &ouml;ffentlich ein. Dieses Klasse soll die Felder <b>ID <\/b>und <b>Name <\/b>erhalten:<\/p>\n<pre>namespace CustomerManagement.Models {\r\n     public class Salutation {\r\n         public int ID { get; set; }\r\n         public string Name { get; set; }\r\n     }\r\n}<\/pre>\n<p>Nun m&uuml;ssen wir noch die <b>DbSet<\/b>-Elemente in der Klasse <b>CustomerManagementContext <\/b>hinzuf&uuml;gen. Damit wir dabei auf die Klassen <b>Customer <\/b>und <b>Salutation <\/b>als Datentypen der Auflistungen zugreifen k&ouml;nnen, machen wir den Namespace <b>CustomerManagement.Models <\/b>mit der <b>using<\/b>-Anweisung verf&uuml;gbar:<\/p>\n<pre>namespace CustomerManagement {\r\n     ...\r\n     using CustomerManagement.Models;<\/pre>\n<p>Dann folgt die eigentliche Klasse mit dem zun&auml;chst leeren Konstruktor:<\/p>\n<pre>     public class CustomerManagementContext : DbContext {\r\n         public CustomerManagementContext() : base(\"name=CustomerManagementContext\") {\r\n         }<\/pre>\n<p>Diese enth&auml;lt dann schlie&szlig;lich die <b>DbSet<\/b>-Elemente f&uuml;r die <b>Customers<\/b>&#8211; und die <b>Salutations<\/b>-Auflistungen:<\/p>\n<pre>         public virtual DbSet&lt;Salutation&gt; Salutations { get; set; }\r\n         public virtual DbSet&lt;Customer&gt; Customers { get; set; }\r\n     }\r\n}<\/pre>\n<p>Damit haben wir die Voraussetzungen geschaffen, erstmalig die Datenbank zu erstellen. Das erledigen wir initial mit den drei folgenden Anweisungen, die wir in der Paket-Manager-Konsole absetzen. Die erste lautet wie folgt und aktiviert die Migration zum Datenbankserver. Dabei wird ein Verzeichnis namens <b>Migrations<\/b> erstellt sowie eine Datei namens <b>Configurations.cs<\/b>, die unter anderem die <b>Seed<\/b>-Methode enth&auml;lt, in der Sie Anweisungen zum F&uuml;llen der erzeugten Tabellen mit Daten hinzuf&uuml;gen k&ouml;nnen (dieser Befehl ist ab Version 2.1 nicht mehr n&ouml;tig):<\/p>\n<pre>enable-migrations<\/pre>\n<p>Die zweite erstellt den Code f&uuml;r die initiale Migration. Dieser wird in der Datei angelegt, die mit einer Zahl beginnt und mit <b>&#8230;Init.cs <\/b>endet:<\/p>\n<pre>add-migration Init<\/pre>\n<p>Nun m&uuml;ssen Sie die Migration nur noch aufrufen, was Sie zum Beispiel mit der folgenden Anweisung erledigen:<\/p>\n<pre>update-database<\/pre>\n<p>Alternativ k&ouml;nnen Sie daf&uuml;r sorgen, dass die Migrationen beim Start der Anwendung automatisch durchgef&uuml;hrt werden. Dazu rufen Sie einmalig den folgenden Befehl in der Paket-Manager-Konsole auf:<\/p>\n<pre>enable-migrations -EnableAutomaticMigration:$true <\/pre>\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\/55000137\/\">\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\/55000137?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<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000137\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\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;EDM: Der Code First-Ansatz&#8221; haben wir gezeigt, wie Sie unter Nutzung des Entity Frameworks ein Datenmodell per Klassenmodell programmieren und dann mit ein paar Befehlen daf&uuml;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 &uuml;bertragen werden.<\/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":[662018,66042018,44000021],"tags":[],"yst_prominent_words":[],"class_list":["post-55000137","post","type-post","status-publish","format-standard","hentry","category-662018","category-66042018","category-Entity_Framework"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000137","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=55000137"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000137\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000137"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000137"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000137"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000137"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}