Cara menggunakan mysql ef core

Photo by Sinitta Leunen on Unsplash

Hai, apakabar teman-teman dotnet-ters? Jumpa lagi dengan saya dalam sesi ASP.NET Core hehehe… Kita udah tau nih ASP.NET Core itu udah cross-platform, nah Entity Framewok (EF) Core itu juga EF versi cross-platform yang di-maintain oleh Microsoft. Bagi yang belum kenal dengan EF, kiranya EF itu merupakan framework yang implementasi ORM.

ORM (Object Relational Mapping) merupakan teknik pemrograman yang melakukan konversi tabel-tabel pada database relasional dengan kelas-kelas pada pemrograman berorientasi objek, tampak seperti database objek virtual.

-Wikipedia

ORM merupakan favorit bagi programmer dotnet yang kebanyakan tidak terlalu mahir dengan sintaks SQL pada database (db) engine tertentu (PostgreSQL, MySQL, Oracle, SQL Server, dsb), customer yang plin-plan dalam menentukan DB Engine relasional yang harus digunakan dalam proyek, atau hanya sekadar memanfaatkan ORM.

Terdapat beberapa hal yang menarik untuk dibahas disini.

Code-First vs DB-First

Dalam proses development software, kita-kita sebagai programmer memiliki dua style, yaitu Code-First dan DB-First. Dengan Code-First, kita melakukan implementasi data model langsung ke kode program dan EF Core akan membuat DDL dan generate tabel-tabel ke database engine yang telah ditentukan. Selain itu, dengan DB-First, kita implementasi data model ke database engine yang telah ditentukan, lalu generate kelas-kelas ORM dengan EF-Core. Kedua style tersebut dapat digunakan tergantung kebutuhan :).

Terdapat blog yang membahas Code-First dan DB-First, dibawah ini… :)

Database Migration?

Apa yang terbesit di pikiran anda bila terdapat perubahan proses bisnis? Skema database dapat berubah! (tergantung sikon). Untuk menangani hal tersebut, programmer style DB-First pasti menyiapkan query untuk ubah data, migrasi data ke tabel baru, alter table, create table, bahkan drop table. Programmer dengan style Code-First harus menyiapkan kode untuk migration dan versioning atas migration tersebut.

Untuk dokumentasi resmi terkait Code-First Migration, berikut merupakan linknya :)

Selain itu, ada blog khusus yang menarik terkait migration ketika database telah berada di tahap production…

DB Engine Bebas?

Well, enggak juga, harus DB Engine yang relasional-lah :). Walaupun relasional, dukungan tetap tergantung dengan ketersediaan library yang menjadi jembatan antara sintaks query DB Engine yang ada dengan EF Core, kecuali anda ingin membuat library sendiri. Karena ORM bersifat independent terhadap database engine tertentu, maka EF Core ini juga dapat dibuat demikian :).

Berikut merupakan setup EF Core pada engine MySQL aplikasi ASP.NET Core dengan library Pomelo di kelas Startup, method ConfigureServices.

services.AddDbContextPool<TAppDbContextEntity>(options => {
options.UseMySql(base.ConnectionString);
});

Jika anda ingin menggunakan SQL Server, anda dapat menambahkan library yang mendukung dan melakukan setup berdasarkan petunjuk yang telah disediakan oleh library tersebut.

services.AddDbContextPool<TAppDbContextEntity>(options => {
options.UseSqlServer(connectionString);
options.UseInternalServiceProvider(
new ServiceCollection()
.AddEntityFrameworkSqlServer()
.BuildServiceProvider()
);
});

Kita juga dapat berpindah DB Engine tanpa mengubah kode ORM yang telah kita buat, terutama proses development yang menggunakan konsep Code-First. Berikut merupakan implementasinya.

Multiple Support DB Engine

Connection Pool

Photo by Marc-Olivier Jodoin on Unsplash

Dalam software yang telah kita bangun, seringkali kita membuat koneksi DB engine, menggunakannya, lalu menutupnya. Namun, apakah hal ini baik bagi performance software yang kita buat?

Salfok dulu ke masalah taksi. Bayangkan, kita pesen taksi untuk berangkat dari Setiabudi ke Pasaraya, Jaksel. Setelah kita sampai tujuan, taksi yang telah mengantar kita pergi untuk mengantar orang lain. Dalam konteks koneksi DB engine, apakah kita dapat melakukan hal yang sama, reuse koneksi yang ada untuk melayani pengunjung website? Inilah yang dinamakan dengan pool taksi, eh bukan… pool bus… eh bukan… connection pool! yihaa….

Berikut merupakan salahsatu blog yang membahas perbedaan performance antara DBContext dan DBContextPool

Dengan connection pool, kita dapat melakukan improve performance pada aplikasi ASP.NET Core yang kita buat! EF Core sebenarnya telah menyediakan fasilitas ini, kita tinggal pakai aja, gausah mikirin cara reuse, open, dan destroy connection…

// Tambah EF-Core Biasa...
services.AddDbContext<TDbContext>(options => ... );
// Tambah EF-Core dengan Connection Pool... \
// (bakal bersifat singleton, hindari custom options dalam kelas
// DB Context)
services.AddDbContextPool<TDbContext>(options => ... );

Karena service yang mengelola pool ini akan bersifat singleton, kita dilarang akses ke kelas DB Context untuk akses database tanpa melalui service ini. Dengan demikian, kita akan patuh terhadap Dependency-Injection Principle.

Dengan prinsip DI, kita dilarang membuat instansiasi DB Context didalam kelas controller, repository, service, atau kelas lainnya, sehingga instance dari DB Context harus dimasukkan kedalam konstruktor masing-masing kelas.

Penggunaan Prinsip DI

Bagaimana dengan penggunaan transaksi yang melibatkan banyak repository? Yuk kita baca artikel saya selanjutnya... :)

Sintaks Query EF-Core

Setelah mengenal EF-Core secara umum, kita salfok ke sintaks query pada EF-Core. Sintaks query pada EF-Core telah disediakan cukup lengkap secara resmi oleh Microsoft, kita dapat mengikutinya :)