{"id":55000155,"date":"2018-12-01T00:00:00","date_gmt":"2020-03-27T19:34:56","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=155"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"SQLite_Code_First_mit_EF_Core","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/SQLite_Code_First_mit_EF_Core\/","title":{"rendered":"SQLite Code First mit EF Core"},"content":{"rendered":"<p><b>Wir haben bereits einige Male SQLite als Datenbanksystem verwendet. Allerdings hatten wir damals jeweils eine Datenbank mit SQLite erstellt und dann ein Entity Data Model daf&uuml;r erstellt. In den letzten Ausgaben haben wir uns jedoch in Zusammenhang mit SQL Server-Datenbanken mit Code First-Migrationen befasst, also den Aufbau der Datenbank durch Klassen beschrieben und dann erst die Datenbank erstellen lassen. Das wollen wir nun auch mit SQLite machen, was erstmals durch Entity Framework Core m&ouml;glich ist. Allerdings sind dazu ein paar Schritte mehr n&ouml;tig, als es mit dem SQL Server der Fall ist.<\/b><\/p>\n<p>Die .NET Core-Vorlagen sind noch &uuml;berschaubar. Derzeit gibt es f&uuml;r den Desktop noch gar keine Vorlage, sondern nur f&uuml;r Konsolen, Klassenbibliotheken und etwa f&uuml;r ASP.NET-Anwendungen (aktueller Stand: <b>.NET Core 2.1<\/b>).<\/p>\n<p>Letztere haben wir ja schon programmiert, nun machen wir uns mit den anderen beiden Typen vertraut. Zum Testen verwenden wir zun&auml;chst die Vorlage <b>Konsolen-App (.NET Core)<\/b> &#8211; siehe Bild 1. Nachdem wir die Konsolen-App erstellt haben, finden wir die dort &uuml;bliche Klassenbibliothek <b>Program.cs <\/b>vor. Und Sie sehen es richtig: F&uuml;r diese Funktion, also den Zugriff per Entity Framework auf eine SQLite-Datenbank, k&ouml;nnen wir aktuell nicht nur nicht mit WPF arbeiten, sondern die Konsolen-App bietet auch noch keine Unterst&uuml;tzung der Programmiersprache Visual Basic.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_155_001.png\" alt=\"Anlegen eines Projekts auf Basis von .NET Core\" width=\"649,559\" height=\"367,765\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Anlegen eines Projekts auf Basis von .NET Core<\/span><\/b><\/p>\n<p>Zum Gl&uuml;ck haben wir uns in den ersten Ausgaben von <b>DATENBANKENTWICKLER <\/b>auch mit C# besch&auml;ftigt, sodass wir einige wenige Codezeilen leicht damit programmieren k&ouml;nnen. Um die Unterst&uuml;tzung f&uuml;r das Entity Framework hinzuzuf&uuml;gen, klicken Sie mit der rechten Maustaste auf das Projekt-Element im Projektmappen-Explorer und w&auml;hlen aus dem dann erscheinenden Kontextmen&uuml; den Eintrag <b>NuGet-Pakete verwalten <\/b>aus. Hier wechseln Sie dann zum Bereich <b>Durchsuchen <\/b>und geben als Suchbegriff <b>EntityFrameworkCore.Sqlite <\/b>ein.<\/p>\n<p>W&auml;hlen Sie hier die stabilste aktuelle Version aus und klicken Sie auf <b>Installieren <\/b>(siehe Bild 2). Danach werden Sie noch aufgefordert, der Lizenz zuzustimmen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_155_002.png\" alt=\"Hinzuf&uuml;gen der NuGet-Pakete\" width=\"649,559\" height=\"283,7398\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Hinzuf&uuml;gen der NuGet-Pakete<\/span><\/b><\/p>\n<p>Den gleichen Vorgang wiederholen Sie anschlie&szlig;end f&uuml;r das Paket <b>Microsoft.EntityFrameworkCore.Design<\/b>. Schlie&szlig;lich f&uuml;gen wir noch das Package <b>Microsoft.EntityFrameworkCore.Tools <\/b>hinzu.<\/p>\n<h2>Modell erstellen<\/h2>\n<p>Nun ben&ouml;tigen wir das Entity Data Model. Dazu legen Sie eine neue Klasse namens <b>BestellverwaltungContext.cs <\/b>an. Dieser f&uuml;gen wir zun&auml;chst einige Verweise auf Namespaces hinzu:<\/p>\n<pre>using System;\r\nusing System.ComponentModel.DataAnnotations.Schema;\r\nusing System.ComponentModel.DataAnnotations;\r\nusing Microsoft.EntityFrameworkCore;<\/pre>\n<p>Der Code der Klasse selbst sieht wie folgt aus. Die Klasse implementiert die Schnittstelle <b>DbContext<\/b>.<\/p>\n<p>Als Erstes f&uuml;gen wir eine Methode namens <b>OnModelCreating <\/b>hinzu, welche die eindeutigen Indizes f&uuml;r die betroffenen Felder hinzuf&uuml;gt:<\/p>\n<pre>namespace CoreSQListe {\r\n     class BestellverwaltungContext : DbContext {\r\n         \/\/eindeutigen Index f&uuml;r EntityFrameworkCore:\r\n         protected override void OnModelCreating(ModelBuilder builder) {\r\n             builder.Entity&lt;Anrede&gt;()\r\n                 .HasIndex(a =&gt; a.Name)\r\n                 .IsUnique(true);\r\n             builder.Entity&lt;Bestellposition&gt;()\r\n                 .HasIndex(b =&gt; new { b.BestellungID, b.ProduktID })\r\n                 .IsUnique(true);\r\n         }<\/pre>\n<p>Die n&auml;chste Methode hei&szlig;t <b>OnConfiguring <\/b>und legt den Namen der zu erstellenden beziehungsweise zu verwendenden SQLite-Datenbank fest. Das erledigen wir mit der Methode <b>UseSqlite <\/b>des mit dem Parameter <b>optionsBuilder <\/b>&uuml;bergebenen Elements.<\/p>\n<p>Der Parameter dieser Methode hei&szlig;t <b>Data Source <\/b>und soll in diesem Fall den Wert <b>Bestellverwaltung.db <\/b>annehmen:<\/p>\n<pre>         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {\r\n             optionsBuilder.UseSqlite(\"Data Source=Bestellverwaltung.db\");\r\n         }<\/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\/55000155\/\">\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\/55000155?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\/55000155\/\"\/>\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>Wir haben bereits einige Male SQLite als Datenbanksystem verwendet. Allerdings hatten wir damals jeweils eine Datenbank mit SQLite erstellt und dann ein Entity Data Model daf&uuml;r erstellt. In den letzten Ausgaben haben wir uns jedoch in Zusammenhang mit SQL Server-Datenbanken mit Code First-Migrationen befasst, also den Aufbau der Datenbank durch Klassen beschrieben und dann erst die Datenbank erstellen lassen. Das wollen wir nun auch mit SQLite machen, was erstmals durch Entity Framework Core m&ouml;glich ist. Allerdings sind dazu ein paar Schritte mehr n&ouml;tig, als es mit dem SQL Server der Fall ist.<\/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,44000020,44000006],"tags":[],"yst_prominent_words":[],"class_list":["post-55000155","post","type-post","status-publish","format-standard","hentry","category-662018","category-66062018","category-Entity_Framework_Core","category-SQL_Server_und_Co"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000155","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=55000155"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000155\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000155"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}