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).
Pada posting ini akan digunakan Entity Framework Core sebagai data access framework. Framework ini akan membuat kode yang ditulis akan lebih singkat. 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.
EF Core mendukung berbagai macam database, tetapi tergantung ketersediaan provider database. Saat posting ini ditulis telah tersedia provider database sebagai berikut:
- MS SQL Server.
- MS SQL Server Compact Edition.
- SQLite.
- MySQL
- PostgreSQL dan lain-lain
EF Core mendukung dua pendekatan dalam mengembangkan aplikasi, yaitu:
- 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.
- 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.
Pada posting ini akan menggunakan pendekatan Database First.
{Koreksi}
Jika pada posting sebelumnya digunakan nama tabel guestbook. Maka pada posting ini perlu dikoreksi nama tabel yang digunakan, yaitu menjadi guestbooks (dengan s). Berikut ini adalah script SQL untuk membuat tabel guestbooks.
create table guestbooks( guestbook_id INT NOT NULL AUTO_INCREMENT, guest_name VARCHAR(100) NOT NULL, guest_email VARCHAR(100) NOT NULL, message VARCHAR(256) NOT NULL, PRIMARY KEY ( guestbook_id ) );
{Modifikasi File project.json}
Langkah pertama adalah memodifikasi file project.json menjadi seperti berikut ini.
{ "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0", "type": "platform" }, "Microsoft.AspNetCore.Diagnostics": "1.1.0", "Microsoft.AspNetCore.Server.IISIntegration": "1.1.0", "Microsoft.AspNetCore.Server.Kestrel": "1.1.0", "Microsoft.Extensions.Logging.Console": "1.1.0", "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0", "Microsoft.Extensions.Configuration.FileExtensions": "1.1.0", "Microsoft.Extensions.Configuration.Json": "1.1.0", "Microsoft.Extensions.Configuration.CommandLine": "1.1.0", "Microsoft.AspNetCore.Mvc": "1.1.0", "Microsoft.AspNetCore.StaticFiles": "1.1.0", "Microsoft.EntityFrameworkCore": "1.1.0", "Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final", "MySql.Data.Core": "7.0.4-IR-191", "MySql.Data.EntityFrameworkCore":"7.0.4-IR-191" },
“tools”: {
“Microsoft.AspNetCore.Server.IISIntegration.Tools”: “1.1.0-preview4-final”
},
“frameworks”: {
“netcoreapp1.1”: {
“imports”: [
“dotnet5.6”,
“portable-net45+win8”
]
}
},
“buildOptions”: {
“emitEntryPoint”: true,
“preserveCompilationContext”: true
},
“runtimeOptions”: {
“configProperties”: {
“System.GC.Server”: true
}
},
“publishOptions”: {
“include”: [
“wwwroot”,
“web.config”
]
},
“scripts”: {
“postpublish”: [ “dotnet publish-iis –publish-folder %publish:OutputPath% –framework %publish:FullTargetFramework%” ]
},
“tooling”: {
“defaultNamespace”: “EFCoreGuestBook”
}
}
Untuk implementasi EF Core untuk mengakses database MySQL maka 3 baris ini harus ditambahkan pada file ini.
"Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final", "MySql.Data.Core": "7.0.4-IR-191", "MySql.Data.EntityFrameworkCore":"7.0.4-IR-191"
{Koreksi Class Model GuestBook}
Pada bagian ini akan diperlihatkan perubahan class model GuestBook agar dapat digunakan untuk mendukung implementasi EF Core. Berikut adalah isi class model GuestBook yang telah diperbaiki.
using System;
namespace EFCoreGuestBook.Models
{
public partial class GuestBook{
public int Id {set; get;}
public String Email {set; get;}
public String Name {set; get;}
public String Message {set; get;}
}
}
{DbContext}
Selanjutnya adalah membuat class turunan dari class DbContext. Nama class yang akan dibuat adalah GuestBookDataContext yang akan disimpan ke dalam file GuestBookDataContext.cs pada folder Model. Berikut adalah isi file ini.
using Microsoft.EntityFrameworkCore; using MySQL.Data.EntityFrameworkCore.Extensions;
namespace EFCoreGuestBook.Models{
public class GuestBookDataContext : DbContext
{
public static string ConnectionString { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL(ConnectionString);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<GuestBook>(entity =>
{
entity.Property(e => e.Id).HasColumnName(“guestbook_id”);
entity.Property(e => e.Email).HasColumnName(“guest_email”);
entity.Property(e => e.Name).HasColumnName(“guest_name”);
entity.Property(e => e.Message).HasColumnName(“message”);
});
}
public virtual DbSet<GuestBook> GuestBooks { get; set; }
}
}
Hal penting dari kode di atas adalah bagaimana memetakan antara property-property dari class model GuestBook dengan atribut-atribut dari tabel guestbook. Untuk memetakan keduanya dapat dilihat pada baris berikut ini.
modelBuilder.Entity<GuestBook>(entity => { entity.Property(e => e.Id).HasColumnName("guestbook_id"); entity.Property(e => e.Email).HasColumnName("guest_email"); entity.Property(e => e.Name).HasColumnName("guest_name"); entity.Property(e => e.Message).HasColumnName("message"); });
Sedangkan untuk “memetakan” antara tabel dengan class model dapat dilihat pada baris berikut ini.
public virtual DbSet<GuestBook> GuestBooks { get; set; }
{Modifikasi File Startup.cs}
Selanjutnya adalah memodifikasi file Startup.cs menjadi seperti contoh di bawah ini.
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Configuration;
using EFCoreGuestBook.Models;
namespace EFCoreGuestBook
{
public class Startup
{
public static IConfigurationRoot Configuration { get; set; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”, optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
GuestBookDataContext.ConnectionString = Configuration.GetConnectionString(“Default”);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler(“/Home/Error”);
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: “default”,
template: “{controller=Home}/{action=Index}/{id?}”);
});
}
}
}
Hal penting pada file ini yang berhubungan dengan implementasi EF Core adalah baris berikut ini.
GuestBookDataContext.ConnectionString = Configuration.GetConnectionString("Default");
Baris tersebut menentukan connection string yang akan digunakan.
{Modifikasi Class Controller HomeController}
Berikut ini adalah modifikasi file class controller HomeController setelah mengimplementasikan EF Core.
using System.Linq; using Microsoft.AspNetCore.Mvc; using EFCoreGuestBook.Models;
namespace EFCoreGuestBook.Controllers
{
public class HomeController : Controller
{
private GuestBookDataContext db;
[HttpGet]
public IActionResult Index()
{
GuestBookDataContext db = new GuestBookDataContext();
var items = db.GuestBooks.ToList();
return View(items);
}
[HttpGet]
public IActionResult Create(){
return View();
}
[HttpPost]
public IActionResult Create(GuestBook item){
if(ModelState.IsValid){
GuestBookDataContext db = new GuestBookDataContext();
db.Add(item);
db.SaveChanges();
return RedirectToAction(“Index”);
}
return View();
}
[HttpGet]
public IActionResult Error()
{
return View();
}
}
}
Dapat dilihat di kode tersebut, dimana untuk melakukan “koneksi ke database” cukup dilakukan dengan menulis sebaris kode berikut ini.
GuestBookDataContext db = new GuestBookDataContext();
Kemudian untuk melakukan “select * table” dapat dilakukan dengan sebaris kode berikut.
var items = db.GuestBooks.ToList();
Dan terakhir adalah untuk “insert data ke dalam table ” dapat dilakukan dengan baris kode berikut ini.
db.Add(item); db.SaveChanges();
{Penutup}
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 http://www.rezafaisal.net/?p=3187.
Untuk mendapatkan source code lengkap didownload pada link berikut: https://github.com/rezafaisal/ASPNETCoreMySQL pada bagian EFCoreGuestBook.
Selamat mencoba.