{"id":55000154,"date":"2018-12-01T00:00:00","date_gmt":"2020-03-27T19:34:50","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=154"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"EDM_mnBeziehung_per_Code_First","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/EDM_mnBeziehung_per_Code_First\/","title":{"rendered":"EDM: m:n-Beziehung per Code First"},"content":{"rendered":"<p><b>Genau wie 1:n-Beziehungen k&ouml;nnen Sie mit Code First auch m:n-Beziehungen abbilden. Wer denkt, dass dazu wie in Datenbanksystem eine Art Verkn&uuml;pfungsklasse notwendig ist, hat Recht &#8211; diese ist aber nur in bestimmten F&auml;llen notwendig. Welche das sind und wie Sie die verschiedenen Arten einer m:n-Beziehung unter Code First abbilden, erfahren Sie in diesem Artikel. Au&szlig;erdem zeigen wir, welche Datenmodelle beim Migrieren der Klassen in ein Datenbanksystem entstehen.<\/b><\/p>\n<h2>Vorbereitungen<\/h2>\n<p>Die Vorbereitungen laufen wie im Artikel <b>EDM: 1:n-Beziehungen per Code First <\/b>beschrieben. <\/p>\n<h2>Verschiedene Arten von m:n-Beziehungen<\/h2>\n<p>Wir k&uuml;mmern uns in diesem Artikel um zwei verschiedene Arten von m:n-Beziehungen. Die erste Art geht davon aus, dass nur die Beziehung zwischen den Elementen zweier Klassen abgebildet werden soll. Das kann zum Beispiel die Beziehung zwischen Artikeln und Kategorien sein. Sie k&ouml;nnen jedem Artikel eine oder mehrere Kategorien zuweisen und jeder Kategorie ein oder mehrere Artikel. Dabei sind f&uuml;r eine Beziehung keine weiteren Informationen notwendig. Die zweite Art der Beziehung enth&auml;lt zus&auml;tzliche Informationen zu jeder Kombination der beteiligten Klassen. Dabei kann es sich etwa die Beziehung zwischen einer Bestellung und den darin enthaltenen Artikeln handeln. Jede Bestellung kann mehrere Artikel enthalten und umgekehrt &#8211; insofern unterscheidet sich dies nicht von der einfachen m:n-Beziehung. Allerdings wollen wir in diesem Fall zu jeder Kombination noch weitere Informationen speichern, im einfachsten Fall die Menge der bestellten Artikel in einer Bestellung. Hier w&uuml;rden wir im Datenbanksystem einfach ein weiteres Feld zu der Verkn&uuml;pfungstabelle hinzuf&uuml;gen. In der Modellierung der Klassen ergeben sich weitreichendere Unterschiede, wie die folgenden Beispiele zeigen werden.<\/p>\n<h2>Klassen f&uuml;r eine einfache m:n-Beziehung<\/h2>\n<p>Wir wollen zun&auml;chst eine einfache m:n-Beziehung abbilden, wie sie zwischen Artikeln und Kategorien vorgenommen wird. Dazu legen wir als Erstes die einfachen Klassen f&uuml;r diese beiden Entit&auml;ten an &#8211; in unserem Beispiel im Verzeichnis <b>Data<\/b>. Die Klasse enth&auml;lt die Felder <b>ID<\/b>, <b>Name <\/b>und <b>Price<\/b>:<\/p>\n<pre>namespace EDMFluentAPI.Data {\r\n     public class Article {\r\n         public int ID { get; set; }\r\n         public string Name { get; set; }\r\n         public decimal Price { get; set; }\r\n     }\r\n}<\/pre>\n<p>Die Klasse f&uuml;r die Kategorien halten wir noch einfacher &#8211; sie soll nur das Feld <b>ID <\/b>und das Feld <b>Name <\/b>enthalten:<\/p>\n<pre>public class Category {\r\n     public int ID { get; set; }\r\n     public string Name { get; set; }\r\n}<\/pre>\n<p>Wie stellen wir nun die Beziehung her Das gelingt ganz einfach, indem wir beiden Klassen jeweils eine <b>ICollection<\/b>-Auflistung mit dem Typ des jeweils zu verkn&uuml;pfenden Elements hinzuf&uuml;gen. Zun&auml;chst f&uuml;r die Klasse <b>Article<\/b>:<\/p>\n<pre>public class Article {\r\n     ...\r\n     public ICollection&lt;Category&gt; Categories { get; set; }\r\n}<\/pre>\n<p>F&uuml;r die Klasse <b>Category <\/b>sieht das andersherum aus:<\/p>\n<pre>public class Category {\r\n     ...\r\n     public ICollection&lt;Article&gt; Articles { get; set; }\r\n}<\/pre>\n<p>Wir d&uuml;rfen nat&uuml;rlich nicht vergessen, beide Klassen &uuml;ber entsprechende <b>DbSet<\/b>-Auflistungen zum Datenbankkontext hinzuzuf&uuml;gen:<\/p>\n<pre>public class CustomerManagementContext : DbContext {\r\n     ...\r\n     public virtual DbSet&lt;Article&gt; Articles { get; set; }\r\n     public virtual DbSet&lt;Category&gt; Categories { get; set; }\r\n     ...\r\n}<\/pre>\n<h2>Datenmodell 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\/55000154\/\">\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\/55000154?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\/55000154\/\"\/>\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>Genau wie 1:n-Beziehungen k&ouml;nnen Sie mit Code First auch m:n-Beziehungen abbilden. Wer denkt, dass dazu wie in Datenbanksystem eine Art Verkn&uuml;pfungsklasse notwendig ist, hat Recht &#8211; diese ist aber nur in bestimmten F&auml;llen notwendig. Welche das sind und wie Sie die verschiedenen Arten einer m:n-Beziehung unter Code First abbilden, erfahren Sie in diesem Artikel. Au&szlig;erdem zeigen wir, welche Datenmodelle beim Migrieren der Klassen in ein Datenbanksystem entstehen.<\/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,66062018,44000021],"tags":[],"yst_prominent_words":[],"class_list":["post-55000154","post","type-post","status-publish","format-standard","hentry","category-662018","category-66062018","category-Entity_Framework"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000154","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=55000154"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000154\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000154"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000154"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000154"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}