{"id":3202,"date":"2017-02-13T15:22:14","date_gmt":"2017-02-13T15:22:14","guid":{"rendered":"http:\/\/www.rezafaisal.net\/?p=3202"},"modified":"2017-02-13T15:25:07","modified_gmt":"2017-02-13T15:25:07","slug":"asp-net-core-mvc-entity-framework-core-mysql-provider","status":"publish","type":"post","link":"http:\/\/www.rezafaisal.net\/?p=3202","title":{"rendered":"ASP.NET Core MVC &amp; Entity Framework Core MySQL Provider"},"content":{"rendered":"<p>Jika pada posting sebelumnya telah dijelaskan bagaimana melakukan koneksi dan operasi ke database MySQL dari aplikasi web yang menggunakan framework ASP.NET Core. Tetapi pada posting tersebut masih menggunakan library MySQL.Data.Core dan MySQL.Data.Client secara langsung, sehingga diperlukan banyak baris kode yang harus ditulis untuk melakukan koneksi, dan operasi CRUD (create, retrieve, update dan delete).<\/p>\n<p>Pada posting ini akan digunakan Entity Framework Core sebagai data access framework.\u00a0 Framework ini akan membuat kode yang ditulis akan lebih singkat.\u00a0 Sebagai informasi singkat, Entity Framework Core atau disingkat EF Core adalah object-relational mapper (OR\/M) yang memungkinkan software developer dapat bekerja dengan database dengan object .NET. Hal ini mengurangi kode program untuk mengakses database, karena digantikan oleh class dan method yang telah disediakan oleh framework ini.<\/p>\n<p><a href=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2017\/02\/Capture.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"Capture\" src=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2017\/02\/Capture_thumb.png\" alt=\"Capture\" width=\"550\" height=\"335\" border=\"0\" \/><\/a><\/p>\n<p>EF Core mendukung berbagai macam database, tetapi tergantung ketersediaan provider database. Saat posting ini ditulis telah tersedia provider database sebagai berikut:<\/p>\n<ul>\n<li>MS SQL Server.<\/li>\n<li>MS SQL Server Compact Edition.<\/li>\n<li>SQLite.<\/li>\n<li>MySQL<\/li>\n<li>PostgreSQL dan lain-lain<\/li>\n<\/ul>\n<p>EF Core mendukung dua pendekatan dalam mengembangkan aplikasi, yaitu:<\/p>\n<ul>\n<li>Database First, pendekatan ini umum dilakukan dimana database dan tabel-tabel di dalamnya telah terlebih dahulu dibuat. Kemudian dibuat class model berdasarkan tabel-tabel di dalam database tersebut.<\/li>\n<li>Code First, pada pendekatan ini yang dibuat terlebih dahulu adalah class-class model kemudian tabel-tabel pada database akan secara otomatis dibuat saat pertama kali aplikasi web dijalankan.<\/li>\n<\/ul>\n<p>Pada posting ini akan menggunakan pendekatan Database First.<\/p>\n<p>{<strong><em>Koreksi<\/em><\/strong>}<\/p>\n<p>Jika pada posting sebelumnya digunakan nama tabel guestbook.\u00a0 Maka pada posting ini perlu dikoreksi nama tabel yang digunakan, yaitu menjadi guestbooks (dengan s).\u00a0 Berikut ini adalah script SQL untuk membuat tabel guestbooks.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre id=\"codeSnippet\" style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\"><span style=\"color: #0000ff;\">create<\/span> <span style=\"color: #0000ff;\">table<\/span> guestbooks(\r\n  guestbook_id <span style=\"color: #0000ff;\">INT<\/span> <span style=\"color: #0000ff;\">NOT<\/span> <span style=\"color: #0000ff;\">NULL<\/span> AUTO_INCREMENT,\r\n  guest_name <span style=\"color: #0000ff;\">VARCHAR<\/span>(100) <span style=\"color: #0000ff;\">NOT<\/span> <span style=\"color: #0000ff;\">NULL<\/span>,\r\n  guest_email <span style=\"color: #0000ff;\">VARCHAR<\/span>(100) <span style=\"color: #0000ff;\">NOT<\/span> <span style=\"color: #0000ff;\">NULL<\/span>,\r\n  message <span style=\"color: #0000ff;\">VARCHAR<\/span>(256) <span style=\"color: #0000ff;\">NOT<\/span> <span style=\"color: #0000ff;\">NULL<\/span>,\r\n  <span style=\"color: #0000ff;\">PRIMARY<\/span> <span style=\"color: #0000ff;\">KEY<\/span> ( guestbook_id )\r\n);<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>{<strong><em>Modifikasi File project.json<\/em><\/strong>}<\/p>\n<p>Langkah pertama adalah memodifikasi file project.json menjadi seperti berikut ini.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\">{\r\n  <span style=\"color: #006080;\">\"dependencies\"<\/span>: {\r\n    <span style=\"color: #006080;\">\"Microsoft.NETCore.App\"<\/span>: {\r\n      <span style=\"color: #006080;\">\"version\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n      <span style=\"color: #006080;\">\"type\"<\/span>: <span style=\"color: #006080;\">\"platform\"<\/span>\r\n    },\r\n    <span style=\"color: #006080;\">\"Microsoft.AspNetCore.Diagnostics\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n    <span style=\"color: #006080;\">\"Microsoft.AspNetCore.Server.IISIntegration\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n    <span style=\"color: #006080;\">\"Microsoft.AspNetCore.Server.Kestrel\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n    <span style=\"color: #006080;\">\"Microsoft.Extensions.Logging.Console\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n    <span style=\"color: #006080;\">\"Microsoft.Extensions.Configuration.EnvironmentVariables\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n    <span style=\"color: #006080;\">\"Microsoft.Extensions.Configuration.FileExtensions\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n    <span style=\"color: #006080;\">\"Microsoft.Extensions.Configuration.Json\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n    <span style=\"color: #006080;\">\"Microsoft.Extensions.Configuration.CommandLine\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n    <span style=\"color: #006080;\">\"Microsoft.AspNetCore.Mvc\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n    <span style=\"color: #006080;\">\"Microsoft.AspNetCore.StaticFiles\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n    <span style=\"color: #006080;\">\"Microsoft.EntityFrameworkCore\"<\/span>: <span style=\"color: #006080;\">\"1.1.0\"<\/span>,\r\n    <span style=\"color: #006080;\">\"Microsoft.EntityFrameworkCore.Tools\"<\/span>: <span style=\"color: #006080;\">\"1.1.0-preview4-final\"<\/span>,\r\n    <span style=\"color: #006080;\">\"MySql.Data.Core\"<\/span>: <span style=\"color: #006080;\">\"7.0.4-IR-191\"<\/span>,\r\n    <span style=\"color: #006080;\">\"MySql.Data.EntityFrameworkCore\"<\/span>:<span style=\"color: #006080;\">\"7.0.4-IR-191\"<\/span>\r\n  },<\/pre>\n<p><span style=\"color: #006080;\">&#8220;tools&#8221;<\/span>: {<br \/>\n<span style=\"color: #006080;\">&#8220;Microsoft.AspNetCore.Server.IISIntegration.Tools&#8221;<\/span>: <span style=\"color: #006080;\">&#8220;1.1.0-preview4-final&#8221;<\/span><br \/>\n},<\/p>\n<p><span style=\"color: #006080;\">&#8220;frameworks&#8221;<\/span>: {<br \/>\n<span style=\"color: #006080;\">&#8220;netcoreapp1.1&#8221;<\/span>: {<br \/>\n<span style=\"color: #006080;\">&#8220;imports&#8221;<\/span>: [<br \/>\n<span style=\"color: #006080;\">&#8220;dotnet5.6&#8221;<\/span>,<br \/>\n<span style=\"color: #006080;\">&#8220;portable-net45+win8&#8221;<\/span><br \/>\n]<br \/>\n}<br \/>\n},<\/p>\n<p><span style=\"color: #006080;\">&#8220;buildOptions&#8221;<\/span>: {<br \/>\n<span style=\"color: #006080;\">&#8220;emitEntryPoint&#8221;<\/span>: <span style=\"color: #0000ff;\">true<\/span>,<br \/>\n<span style=\"color: #006080;\">&#8220;preserveCompilationContext&#8221;<\/span>: <span style=\"color: #0000ff;\">true<\/span><br \/>\n},<\/p>\n<p><span style=\"color: #006080;\">&#8220;runtimeOptions&#8221;<\/span>: {<br \/>\n<span style=\"color: #006080;\">&#8220;configProperties&#8221;<\/span>: {<br \/>\n<span style=\"color: #006080;\">&#8220;System.GC.Server&#8221;<\/span>: <span style=\"color: #0000ff;\">true<\/span><br \/>\n}<br \/>\n},<\/p>\n<p><span style=\"color: #006080;\">&#8220;publishOptions&#8221;<\/span>: {<br \/>\n<span style=\"color: #006080;\">&#8220;include&#8221;<\/span>: [<br \/>\n<span style=\"color: #006080;\">&#8220;wwwroot&#8221;<\/span>,<br \/>\n<span style=\"color: #006080;\">&#8220;web.config&#8221;<\/span><br \/>\n]<br \/>\n},<\/p>\n<p><span style=\"color: #006080;\">&#8220;scripts&#8221;<\/span>: {<br \/>\n<span style=\"color: #006080;\">&#8220;postpublish&#8221;<\/span>: [ <span style=\"color: #006080;\">&#8220;dotnet publish-iis &#8211;publish-folder %publish:OutputPath% &#8211;framework %publish:FullTargetFramework%&#8221;<\/span> ]<br \/>\n},<\/p>\n<p><span style=\"color: #006080;\">&#8220;tooling&#8221;<\/span>: {<br \/>\n<span style=\"color: #006080;\">&#8220;defaultNamespace&#8221;<\/span>: <span style=\"color: #006080;\">&#8220;EFCoreGuestBook&#8221;<\/span><br \/>\n}<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Untuk implementasi EF Core untuk mengakses database MySQL maka 3 baris ini harus ditambahkan pada file ini.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre id=\"codeSnippet\" style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\"><span style=\"color: #006080;\">\"Microsoft.EntityFrameworkCore.Tools\"<\/span>: <span style=\"color: #006080;\">\"1.1.0-preview4-final\"<\/span>,\r\n<span style=\"color: #006080;\">\"MySql.Data.Core\"<\/span>: <span style=\"color: #006080;\">\"7.0.4-IR-191\"<\/span>,\r\n<span style=\"color: #006080;\">\"MySql.Data.EntityFrameworkCore\"<\/span>:<span style=\"color: #006080;\">\"7.0.4-IR-191\"<\/span><\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>{<strong><em>Koreksi Class Model GuestBook<\/em><\/strong>}<\/p>\n<p>Pada bagian ini akan diperlihatkan perubahan class model GuestBook agar dapat digunakan untuk mendukung implementasi EF Core.\u00a0 Berikut adalah isi class model GuestBook yang telah diperbaiki.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\"><span style=\"color: #0000ff;\">using<\/span> System;<\/pre>\n<p><span style=\"color: #0000ff;\">namespace<\/span> EFCoreGuestBook.Models<br \/>\n{<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">partial<\/span> <span style=\"color: #0000ff;\">class<\/span> GuestBook{<\/p>\n<p><span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">int<\/span> Id {set; get;}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> String Email {set; get;}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> String Name {set; get;}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> String Message {set; get;}<br \/>\n}<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<p>{<strong><em>DbContext<\/em><\/strong>}<\/p>\n<p>Selanjutnya adalah membuat class turunan dari class DbContext.\u00a0 Nama class yang akan dibuat adalah GuestBookDataContext yang akan disimpan ke dalam file GuestBookDataContext.cs pada folder Model.\u00a0 Berikut adalah isi file ini.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\"><span style=\"color: #0000ff;\">using<\/span> Microsoft.EntityFrameworkCore;\r\n<span style=\"color: #0000ff;\">using<\/span> MySQL.Data.EntityFrameworkCore.Extensions;<\/pre>\n<p><span style=\"color: #0000ff;\">namespace<\/span> EFCoreGuestBook.Models{<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">class<\/span> GuestBookDataContext : DbContext<br \/>\n{<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">static<\/span> <span style=\"color: #0000ff;\">string<\/span> ConnectionString { get; set; }<\/p>\n<p><span style=\"color: #0000ff;\">protected<\/span> <span style=\"color: #0000ff;\">override<\/span> <span style=\"color: #0000ff;\">void<\/span> OnConfiguring(DbContextOptionsBuilder optionsBuilder)<br \/>\n{<br \/>\noptionsBuilder.UseMySQL(ConnectionString);<br \/>\n}<\/p>\n<p><span style=\"color: #0000ff;\">protected<\/span> <span style=\"color: #0000ff;\">override<\/span> <span style=\"color: #0000ff;\">void<\/span> OnModelCreating(ModelBuilder modelBuilder)<br \/>\n{<br \/>\nmodelBuilder.Entity&lt;GuestBook&gt;(entity =&gt;<br \/>\n{<br \/>\nentity.Property(e =&gt; e.Id).HasColumnName(<span style=\"color: #006080;\">&#8220;guestbook_id&#8221;<\/span>);<br \/>\nentity.Property(e =&gt; e.Email).HasColumnName(<span style=\"color: #006080;\">&#8220;guest_email&#8221;<\/span>);<br \/>\nentity.Property(e =&gt; e.Name).HasColumnName(<span style=\"color: #006080;\">&#8220;guest_name&#8221;<\/span>);<br \/>\nentity.Property(e =&gt; e.Message).HasColumnName(<span style=\"color: #006080;\">&#8220;message&#8221;<\/span>);<br \/>\n});<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">virtual<\/span> DbSet&lt;GuestBook&gt; GuestBooks { get; set; }<br \/>\n}<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Hal penting dari kode di atas adalah bagaimana memetakan antara property-property dari class model GuestBook dengan atribut-atribut dari tabel guestbook.\u00a0 Untuk memetakan keduanya dapat dilihat pada baris berikut ini.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre id=\"codeSnippet\" style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\">modelBuilder.Entity&lt;GuestBook&gt;(entity =&gt;\r\n{\r\n    entity.Property(e =&gt; e.Id).HasColumnName(<span style=\"color: #006080;\">\"guestbook_id\"<\/span>);\r\n    entity.Property(e =&gt; e.Email).HasColumnName(<span style=\"color: #006080;\">\"guest_email\"<\/span>);\r\n    entity.Property(e =&gt; e.Name).HasColumnName(<span style=\"color: #006080;\">\"guest_name\"<\/span>);\r\n    entity.Property(e =&gt; e.Message).HasColumnName(<span style=\"color: #006080;\">\"message\"<\/span>);\r\n});<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Sedangkan untuk \u201cmemetakan\u201d antara tabel dengan class model dapat dilihat pada baris berikut ini.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre id=\"codeSnippet\" style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\"><span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">virtual<\/span> DbSet&lt;GuestBook&gt; GuestBooks { get; set; }<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>{<strong><em>Modifikasi File Startup.cs<\/em><\/strong>}<\/p>\n<p>Selanjutnya adalah memodifikasi file Startup.cs menjadi seperti contoh di bawah ini.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\"><span style=\"color: #0000ff;\">using<\/span> Microsoft.AspNetCore.Builder;\r\n<span style=\"color: #0000ff;\">using<\/span> Microsoft.AspNetCore.Hosting;\r\n<span style=\"color: #0000ff;\">using<\/span> Microsoft.Extensions.DependencyInjection;\r\n<span style=\"color: #0000ff;\">using<\/span> Microsoft.Extensions.Logging;\r\n<span style=\"color: #0000ff;\">using<\/span> Microsoft.Extensions.Configuration;<\/pre>\n<p><span style=\"color: #0000ff;\">using<\/span> EFCoreGuestBook.Models;<\/p>\n<p><span style=\"color: #0000ff;\">namespace<\/span> EFCoreGuestBook<br \/>\n{<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">class<\/span> Startup<br \/>\n{<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">static<\/span> IConfigurationRoot Configuration { get; set; }<\/p>\n<p><span style=\"color: #0000ff;\">public<\/span> Startup(IHostingEnvironment env)<br \/>\n{<br \/>\nvar builder = <span style=\"color: #0000ff;\">new<\/span> ConfigurationBuilder()<br \/>\n.SetBasePath(env.ContentRootPath)<br \/>\n.AddJsonFile(<span style=\"color: #006080;\">&#8220;appsettings.json&#8221;<\/span>, optional: <span style=\"color: #0000ff;\">true<\/span>, reloadOnChange: <span style=\"color: #0000ff;\">true<\/span>)<br \/>\n.AddEnvironmentVariables();<\/p>\n<p>Configuration = builder.Build();<br \/>\n}<br \/>\n<span style=\"color: #008000;\">\/\/ This method gets called by the runtime. Use this method to add services to the container.<\/span><br \/>\n<span style=\"color: #008000;\">\/\/ For more information on how to configure your application, visit https:\/\/go.microsoft.com\/fwlink\/?LinkID=398940<\/span><br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> ConfigureServices(IServiceCollection services)<br \/>\n{<br \/>\nservices.AddMvc();<\/p>\n<p>GuestBookDataContext.ConnectionString = Configuration.GetConnectionString(<span style=\"color: #006080;\">&#8220;Default&#8221;<\/span>);<br \/>\n}<\/p>\n<p><span style=\"color: #008000;\">\/\/ This method gets called by the runtime. Use this method to configure the HTTP request pipeline.<\/span><br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)<br \/>\n{<br \/>\nloggerFactory.AddConsole();<\/p>\n<p><span style=\"color: #0000ff;\">if<\/span> (env.IsDevelopment())<br \/>\n{<br \/>\napp.UseDeveloperExceptionPage();<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">else<\/span><br \/>\n{<br \/>\napp.UseExceptionHandler(<span style=\"color: #006080;\">&#8220;\/Home\/Error&#8221;<\/span>);<br \/>\n}<\/p>\n<p>app.UseStaticFiles();<\/p>\n<p>app.UseMvc(routes =&gt;<br \/>\n{<br \/>\nroutes.MapRoute(<br \/>\nname: <span style=\"color: #006080;\">&#8220;default&#8221;<\/span>,<br \/>\ntemplate: <span style=\"color: #006080;\">&#8220;{controller=Home}\/{action=Index}\/{id?}&#8221;<\/span>);<br \/>\n});<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Hal penting pada file ini yang berhubungan dengan implementasi EF Core adalah baris berikut ini.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre id=\"codeSnippet\" style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\">GuestBookDataContext.ConnectionString = Configuration.GetConnectionString(<span style=\"color: #006080;\">\"Default\"<\/span>);<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Baris tersebut menentukan connection string yang akan digunakan.<\/p>\n<p>{<strong><em>Modifikasi Class Controller HomeController<\/em><\/strong>}<\/p>\n<p>Berikut ini adalah modifikasi file class controller HomeController setelah mengimplementasikan EF Core.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\"><span style=\"color: #0000ff;\">using<\/span> System.Linq;\r\n<span style=\"color: #0000ff;\">using<\/span> Microsoft.AspNetCore.Mvc;\r\n<span style=\"color: #0000ff;\">using<\/span> EFCoreGuestBook.Models;<\/pre>\n<p><span style=\"color: #0000ff;\">namespace<\/span> EFCoreGuestBook.Controllers<br \/>\n{<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">class<\/span> HomeController : Controller<br \/>\n{<br \/>\n<span style=\"color: #0000ff;\">private<\/span> GuestBookDataContext db;<\/p>\n<p>[HttpGet]<br \/>\n<span style=\"color: #0000ff;\">public<\/span> IActionResult Index()<br \/>\n{<br \/>\nGuestBookDataContext db = <span style=\"color: #0000ff;\">new<\/span> GuestBookDataContext();<br \/>\nvar items = db.GuestBooks.ToList();<\/p>\n<p><span style=\"color: #0000ff;\">return<\/span> View(items);<br \/>\n}<\/p>\n<p>[HttpGet]<br \/>\n<span style=\"color: #0000ff;\">public<\/span> IActionResult Create(){<br \/>\n<span style=\"color: #0000ff;\">return<\/span> View();<br \/>\n}<\/p>\n<p>[HttpPost]<br \/>\n<span style=\"color: #0000ff;\">public<\/span> IActionResult Create(GuestBook item){<br \/>\n<span style=\"color: #0000ff;\">if<\/span>(ModelState.IsValid){<br \/>\nGuestBookDataContext db = <span style=\"color: #0000ff;\">new<\/span> GuestBookDataContext();<br \/>\ndb.Add(item);<br \/>\ndb.SaveChanges();<\/p>\n<p><span style=\"color: #0000ff;\">return<\/span> RedirectToAction(<span style=\"color: #006080;\">&#8220;Index&#8221;<\/span>);<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">return<\/span> View();<br \/>\n}<\/p>\n<p>[HttpGet]<br \/>\n<span style=\"color: #0000ff;\">public<\/span> IActionResult Error()<br \/>\n{<br \/>\n<span style=\"color: #0000ff;\">return<\/span> View();<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Dapat dilihat di kode tersebut, dimana untuk melakukan \u201ckoneksi ke database\u201d cukup dilakukan dengan menulis sebaris kode berikut ini.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre id=\"codeSnippet\" style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\">GuestBookDataContext db = <span style=\"color: #0000ff;\">new<\/span> GuestBookDataContext();<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Kemudian untuk melakukan \u201cselect * table\u201d dapat dilakukan dengan sebaris kode berikut.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre id=\"codeSnippet\" style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\">var items = db.GuestBooks.ToList();<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Dan terakhir adalah untuk \u201cinsert data ke dalam table \u201d dapat dilakukan dengan baris kode berikut ini.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre id=\"codeSnippet\" style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\">db.Add(item);\r\ndb.SaveChanges();<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>{<strong><em>Penutup<\/em><\/strong>}<\/p>\n<p>Dari penjelasan di atas, EF Core membuat penulisan kode untuk mengakses dan operasi CRUD menjadi lebih mudah dan kode yang ditulis menjadi lebih singkat, jika dibandingkan pada posting sebelumnya di sini <a title=\"http:\/\/www.rezafaisal.net\/?p=3187\" href=\"http:\/\/www.rezafaisal.net\/?p=3187\">http:\/\/www.rezafaisal.net\/?p=3187<\/a>.<\/p>\n<p>Untuk mendapatkan source code lengkap didownload pada link berikut: <a title=\"https:\/\/github.com\/rezafaisal\/ASPNETCoreMySQL\" href=\"https:\/\/github.com\/rezafaisal\/ASPNETCoreMySQL\">https:\/\/github.com\/rezafaisal\/ASPNETCoreMySQL<\/a> pada bagian EFCoreGuestBook.<\/p>\n<p>Selamat mencoba.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jika pada posting sebelumnya telah dijelaskan bagaimana melakukan koneksi dan operasi ke database MySQL dari aplikasi web yang menggunakan framework ASP.NET Core. Tetapi pada posting tersebut masih menggunakan library MySQL.Data.Core dan MySQL.Data.Client secara langsung, sehingga diperlukan banyak baris kode yang&hellip;<\/p>\n","protected":false},"author":1,"featured_media":3201,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[6],"tags":[160,70,161],"class_list":["post-3202","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-softwaredev","tag-asp-net-core","tag-entity-framework","tag-visual-studio-code"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2017\/02\/Capture_thumb.png","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p1sNAL-PE","_links":{"self":[{"href":"http:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/posts\/3202","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.rezafaisal.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3202"}],"version-history":[{"count":2,"href":"http:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/posts\/3202\/revisions"}],"predecessor-version":[{"id":3204,"href":"http:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/posts\/3202\/revisions\/3204"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/media\/3201"}],"wp:attachment":[{"href":"http:\/\/www.rezafaisal.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3202"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.rezafaisal.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3202"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.rezafaisal.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3202"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}