[CRUD] ASP .NET CORE MVC menggunakan Dapper

Demo Create Read Update Delete dengan asp .net core mvc, menggunakan Razor View dan Dapper. Demo sederhana ini juga akan menunjukan bagaimana mengabstraksi database provider yang bisa digunakan di dalam aplikasi.
Dengan menggunakan Dapper maka suatu aplikasi .NET dapat dengan mudah berganti Database Provider tanpa perlu mengubah sebagian besar kode aplikasi tersebut.

Untuk mencapai tujuan ini, maka sang developer harus menulis langsung perintah SQL untuk setiap query ke database.

Data Access Layer

Buat Project baru dan beri nama dal_crud, pilih tipe .NET Standard dan beri nama solution mvc_crud. Install Dapper nuget package :

Buatlah 1 class baru, dan beri nama DbConn.cs. Di dalam file ini, buatlah 3 class yaitu DbConn, BookRepository dan Book. Ketiga class tersebut mempunya fungsi yang berbeda yaitu: DbConn sebagai Connection Factory, Book sebagai model class dari tabel book dan BookRepository sebagai Repository class dari Book.

using Dapper;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Common;

namespace dal_crud
{
    public class DbConn
    {
        public DbConn(DbConnection connection)
        {
            this.Connection = connection;
        }

        internal DbConnection Connection { get; }

    }

    public class BookRepository
    {
        private DbConn DB;

        public BookRepository(DbConn dbConn)
        {
            this.DB = dbConn;
        }

        public IEnumerable<Book> GetBooks()
        {
            var books = DB.Connection.Query<Book>("select * from book");
            return books;
        }

        public Book GetBook(int id)
        {
            var books = DB.Connection.QuerySingle<Book>("select * from book where id=@id", new { id });
            return books;
        }

        public int Add(Book newbook)
        {
            var ind = DB.Connection.Execute("insert into book(title,author,publisheddate) values(@title,@author,@publisheddate)", newbook);
            return ind;
        }

        public int Delete(int id)
        {
            var ind = DB.Connection.Execute("delete from book where id=@id", new { id });
            return ind;
        }

        public int Update(Book book)
        {
            var ind = DB.Connection.Execute("update book  set title=@title, author=@author, publisheddate=@publisheddate where id=@id", book);
            return ind;
        }
    }
    public class Book
    {

        public int ID { get; set; }
        public string Title { get; set; }
        public string Author { get; set; }
        public DateTime PublishedDate { get; set; }
    }

}


MVC Project

Buat project mvc yang baru di dalam solution yang sama, dan beri nama MVC.

install nuget package : MySql.Data

Kemudian buatlah 2 connection string untuk MSSQL dan MySQL di dalam file appsettings.development.json :

"ConnectionStrings": {
    "Default" : "server=localhost; initial catalog=crud;user id=sa; password=password;"
    
    /* mysql connstring */
    //"Default" : "server=localhost; database=crud;uid=root; password=root;"

  }

Kemudian registrasi class DbConn dan BookRepository di dalam Startup.cs supaya instance dari class tersebut dapat langsung dipakai (via constructor) dalam aplikasi kita tanpa melakukan instansiasi. Ini adalah salah satu design pattern (atau fitur) yang built-in di asp.net core.

   public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            var connectionString = Configuration.GetConnectionString("Default");
            var conn = new SqlConnection(connectionString);
            //var conn = new MySqlConnection(connectionString);

            services.AddScoped<DbConn>(d => new DbConn(conn));
            services.AddScoped<BookRepository>();

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

kemudian buatlah controller baru dan beri nama BookController.cs, untuk mendemokan pemakaian BookRepository dengan melakukan CRUD (Create Read Update Delete) terhadap tabel book.

using dal_crud;
using Microsoft.AspNetCore.Mvc;

namespace mvc.Controllers
{
    public class BookController : Controller
    {
        private BookRepository Repo;

        public BookController(BookRepository repo)
        {
            this.Repo = repo;
        }
        public IActionResult index()
        {
            var b = Repo.GetBooks();
            return View(b);
        }

        public IActionResult create()
        {
            return View();
        }

        [HttpPost]
        public IActionResult create(Book book)
        {
            var b = Repo.Add(book);
            return RedirectToAction("index");
        }
        public IActionResult edit(int id)
        {
            Book b = Repo.GetBook(id);
            return View(b);
        }

        [HttpPost]
        public IActionResult edit(int id, Book book)
        {
            int b = Repo.Update(book);
            return RedirectToAction("index");
        }

        public IActionResult delete(int id)
        {
            Book b = Repo.GetBook(id);
            return View(b);
        }
        [HttpPost]
        public IActionResult confirmdelete(int id)
        {
            int b = Repo.Delete(id);
            return RedirectToAction("index");
        }

        public IActionResult details(int id)
        {
            Book b = Repo.GetBook(id);
            return View(b);
        }


    }
}

Jangan lupa untuk menambahkan project reference dal_crud ke mvc project. Supaya class atau object yang dibuat dalam project dal_crud dapat diakses di mvc project.

Tambahkanlah 4 view sederhana untuk mengakses kontroller di atas. untuk membuat view, visual studio menyediakan fitur scafollding yang mumpuni. dengan klik kanan pada method di controller kemudian pilih add view, akan tampil popup dialog untuk menentukan nama, template view dan Model class yang akan digunakan oleh view tersebut.

Pada tahap ini, aplikasi sudah bisa dijalankan, namun belum ada database dan tabel book yang akan menjadi tempat penyimpanan data dari aplikasi tsb.

MySQL & MSSQL database

Pastikan sudah menginstall MySQL dan MSSQL di komputer, dan buat database di masing – masing dbms tersebut. Beri nama database : crud dan buatlah satu tabel di dalamnya dengan nama : book. Gunakan SQL script di bawah ini :

-- untuk MySQL
CREATE TABLE `book` (
	`ID` INT(11) NOT NULL AUTO_INCREMENT,
	`Title` VARCHAR(250) NOT NULL,
	`Author` VARCHAR(250) NOT NULL,
	`PublishedDate` DATETIME NOT NULL,
	PRIMARY KEY (`ID`)
);

insert into book(title,author,publisheddate)
values('The Power of Habit','Charles Duhigg','2013-04-19');

-- untuk MSSQL
create table book( ID int identity(1,1) primary key, Title varchar(250) not null, Author varchar(250) not null, PublishedDate datetime not null);

insert into book(title,author,publisheddate)
values('The Power of Habit','Charles Duhigg','2013-04-19')

Script di atas akan membuat table book di dalam database crud, eksekusi script di atas sesuai dbms yang dipakai.

Sekarang coba jalankan aplikasi dengan tekan Ctrl + F5 (visual studio), atau ketik dotnet run di terminal/powershell/command prompt dsb. Buka browser dan ketik url https://localhost:5001/book untuk melihat halaman CRUD yang barusan dibuat.

Code snippet (Startup.cs) di atas menggunanakn MSSQL database provider, untuk mengganti database provider dengan MySQL maka gantilah connection string di appsettings.json dan ubah isi ConfigureServices di Startup.cs menggunakan MySQLConnection.

Source Code