ASP.NET Core API #4: Menghubungkan API dengan Database Menggunakan Entity Framework Core

ASP.NET Core API #4: Menghubungkan API dengan Database Menggunakan Entity Framework Core

Halo lagi, calon programmer hebat! 

Di artikel sebelumnya kita sudah punya database WisataDB dengan tabel KategoriWisata dan DaftarWisata. Tapi database itu masih sendiri, belum terhubung dengan API kita. Ibarat kita punya lemari es penuh makanan, tapi kita tidak punya kulkasnya? Maksudnya, kita punya data tapi nggak bisa diambil lewat API. Nah, sekarang kita akan menghubungkannya dengan Entity Framework Core (EF Core)

.

🤣 Kenapa Entity Framework disebut "EF"? Karena dia Enak Flexibel! (maaf dadakan)

Entity Framework Core itu seperti penerjemah antara bahasa C# kita dengan bahasa SQL (bahasa database). Kita nggak perlu nulis SQL lagi kalau pake EF. Tinggal ngomong ke C#, nanti EF yang urus sama database. Praktis banget kayak punya asisten pribadi! [citation:1][citation:3]

Langkah 1: Install NuGet Packages

Sebelum bisa pake EF, kita harus install dulu "mesin"-nya. Caranya gampang:

  1. Buka project WisataAPI di Visual Studio.
  2. Klik kanan di Solution Explorer pada nama project, pilih Manage NuGet Packages.
  3. Di tab Browse, cari dan install 3 package ini (satu-satu ya, jangan terburu-buru):
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.Design

Atau kalau mau lebih keren, bisa pake Package Manager Console (Tools -> NuGet Package Manager -> Package Manager Console) dan ketik:

Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package Microsoft.EntityFrameworkCore.Design

Kenapa tiga-tiganya? [citation:1]

  • SqlServer – biar EF bisa ngomong sama SQL Server.
  • Tools – biar kita bisa pake perintah-perintah EF di console.
  • Design – biar bisa bikin migration (nanti kita bahas).
💡 Kalau tiba-tiba package tidak ketemu, coba centang "Include prerelease" atau pilih sumber package "nuget.org". Jangan panik, itu wajar. [citation:4]

Langkah 2: Membuat Model Class (Entity)

  • Model class ini adalah terjemahan dari tabel database ke dalam bentuk class C#. Kita buat dua class yang sesuai dengan tabel kita.
  • Pertama, buat folder baru di project dengan nama Models (klik kanan project -> Add -> New Folder).
  • Kemudian buat class baru: klik kanan folder Models -> Add -> Class, beri nama KategoriWisata.cs.

Isi dengan kode berikut:

using System.ComponentModel.DataAnnotations;

namespace WisataAPI.Models
{
    public class KategoriWisata
    {
        [Key]
        public int Id { get; set; }
        
        [Required] 
        
        public string Nama { get; set; }
        
        [MaxLength(255)]
        public string? Deskripsi { get; set; }
    }
}

Penjelasan:

  • [Key] – memberi tahu EF bahwa ini adalah primary key.
  • [Required] – kolom ini wajib diisi (sesuai dengan NOT NULL di database).
  • [MaxLength(100)] – panjang maksimal 100 karakter.
  • string? – tanda tanya artinya boleh null (boleh kosong).

Sekarang buat class kedua: DaftarWisata.cs di folder yang sama.

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace WisataAPI.Models
{
    public class DaftarWisata
    {
        [Key]
        public int Id { get; set; }
        
        [Required]
        [MaxLength(100)]
        public string Nama { get; set; }
        
        public string? Deskripsi { get; set; }
        
        [MaxLength(150)]
        public string? Lokasi { get; set; }
        
        [Column(TypeName = "decimal(10,2)")]
        public decimal? HargaTiket { get; set; }
        
        [Required]
        public int KategoriId { get; set; }
        
        // Relasi: satu tempat wisata punya satu kategori
        [ForeignKey("KategoriId")]
        public virtual KategoriWisata? Kategori { get; set; }
    }
}

Penjelasan:

  • [Column(TypeName = "decimal(10,2)")] – menentukan tipe data decimal di database.
  • public virtual KategoriWisata? Kategori { get; set; } – ini adalah navigation property. EF Core bisa otomatis menggabungkan data kategori kalau kita panggil.
  • [ForeignKey("KategoriId")] – menunjukkan bahwa KategoriId adalah foreign key yang menghubungkan ke tabel KategoriWisata.

Langkah 3: Membuat DbContext

  • DbContext adalah jembatan utama antara API kita dan database. Anggap saja ini seperti resepsionis yang mengatur semua komunikasi.
  • Buat folder baru bernama Data (klik kanan project -> Add -> New Folder).
  • Buat class baru di folder Data: klik kanan folder Data -> Add -> Class, beri nama WisataDbContext.cs.

using Microsoft.EntityFrameworkCore;
using WisataAPI.Models;

namespace WisataAPI.Data
{
    public class WisataDbContext : DbContext
    {
        public WisataDbContext(DbContextOptions options) 
            : base(options)
        {
        }

        // DbSet mewakili tabel-tabel di database
        public DbSet<KategoriWisata> KategoriWisata { get; set; }
        public DbSet<DaftarWisata> DaftarWisata { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            // Konfigurasi tambahan (optional)
            modelBuilder.Entity<KategoriWisata>()
                .HasMany(k => k.DaftarWisata)
                .WithOne(d => d.Kategori)
                .HasForeignKey(d => d.KategoriId);
        }
    }
}

DbSet<T> itu seperti daftar isi dari tabel. Nanti kita bisa ambil data dengan _context.KategoriWisata.ToList().

Langkah 4: Menyiapkan Connection String

  • Connection string adalah alamat database kita. Kita simpan di file appsettings.json biar rapi dan aman.
  • Buka file appsettings.json di root project, tambahkan bagian ConnectionStrings seperti ini:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost\\SQLEXPRESS;Database=WisataDB;Trusted_Connection=True;TrustServerCertificate=True;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

Penjelasan connection string: [citation:8]

  • Server=localhost\SQLEXPRESS – nama server SQL Server. Kalau pake SQL Server Express, biasanya seperti itu. Kalau pake LocalDB, bisa ganti (localdb)\mssqllocaldb. [citation:5][citation:10]
  • Database=WisataDB – nama database yang kita buat di artikel #3.
  • Trusted_Connection=True – pakai login Windows (biar gampang).
  • TrustServerCertificate=True – biar aman dan tidak kena error sertifikat.
💡 Kalau SQL Server kamu pake username dan password (bukan Windows Auth), connection string-nya jadi: Server=localhost;Database=WisataDB;User Id=sa;Password=yourpassword;TrustServerCertificate=True; [citation:1]

Langkah 5: Mendaftarkan DbContext di Program.cs

Sekarang kita daftarkan WisataDbContext ke aplikasi kita, biar bisa dipakai di semua tempat. Buka file Program.cs, tambahkan kode berikut di bagian atas (setelah var builder = WebApplication.CreateBuilder(args);):

using Microsoft.EntityFrameworkCore;
using WisataAPI.Data;

var builder = WebApplication.CreateBuilder(args);

// Tambahkan baris ini untuk mendaftarkan DbContext
builder.Services.AddDbContext<WisataDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

GetConnectionString("DefaultConnection") akan membaca connection string dari appsettings.json yang kita buat tadi. [citation:3][citation:8]

Kalau bingung, builder.Configuration itu seperti asisten yang ngambil catatan dari file appsettings.json.

Langkah 6: Tes Koneksi dengan Migration (Opsional)

  • Kita sudah punya database manual dari artikel #3. Tapi kita perlu kasih tahu EF bahwa database sudah ada. Caranya dengan membuat migration awal.
  • Buka Package Manager Console (Tools -> NuGet Package Manager -> Package Manager Console).
  • Pastikan di dropdown Default project terpilih project WisataAPI.

Ketik perintah:

Add-Migration InitialCreate

Perintah ini akan membuat folder Migrations berisi file timestamp_InitialCreate.cs. File ini berisi cetak biru pembuatan tabel berdasarkan model kita. [citation:3][citation:10]

Kemudian kita jalankan:

Update-Database
⚠️ Karena tabel sudah ada di database, perintah Update-Database mungkin akan error karena tabel sudah ada. Itu normal! Kita bisa hapus dulu tabelnya (kalau berani) atau gunakan pendekatan DB First. Tapi untuk latihan, kita bisa lanjut dulu.

Alternatif: kita bisa paksa EF untuk tidak membuat tabel baru dengan menghapus isi migration (kosongkan method Up dan Down). Tapi itu agak ribet. Lebih mudah kita lanjut ke langkah berikutnya.

Langkah 7: Membuat Controller untuk Menguji Koneksi

Sekarang kita buat controller sederhana untuk mengambil data kategori. Buka folder Controllers, tambahkan controller baru: klik kanan -> Add -> Controller -> pilih API Controller - Empty, beri nama KategoriController.cs.

Isi dengan kode berikut:

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using WisataAPI.Data;
using WisataAPI.Models;

namespace WisataAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class KategoriController : ControllerBase
    {
        private readonly WisataDbContext _context;

        public KategoriController(WisataDbContext context)
        {
            _context = context;
        }

        // GET: api/kategori
        [HttpGet]
        public async Task<ActionResult<IEnumerable<KategoriWisata>>> GetKategori()
        {
            return await _context.KategoriWisata.ToListAsync();
        }

        // GET: api/kategori/5
        [HttpGet("{id}")]
        public async Task<ActionResult<KategoriWisata>> GetKategori(int id)
        {
            var kategori = await _context.KategoriWisata.FindAsync(id);

            if (kategori == null)
            {
                return NotFound();
            }

            return kategori;
        }
    }
}

Penjelasan:

  • private readonly WisataDbContext _context; – kita minta DbContext dikirim lewat constructor (ini namanya dependency injection). [citation:3]
  • _context.KategoriWisata.ToListAsync() – ambil semua data kategori dari database. ToListAsync() adalah versi async biar nggak lemot. [citation:6]
  • FindAsync(id) – cari kategori berdasarkan Id.

Langkah 8: Jalankan dan Uji dengan Postman

  • Tekan F5 untuk menjalankan API.
  • Buka Postman, buat request GET ke:
  • https://localhost:7000/api/kategori
  • (Sesuaikan port-nya dengan yang muncul di browser)

Kalau berhasil, akan tampil data kategori dalam format JSON:

[
    {
        "id": 1,
        "nama": "Pantai",
        "deskripsi": "Wisata tepi laut dengan pasir putih"
    },
    {
        "id": 2,
        "nama": "Gunung",
        "deskripsi": "Pendakian dan pemandangan alam"
    },
    {
        "id": 3,
        "nama": "Museum",
        "deskripsi": "Tempat belajar sejarah dan budaya"
    }
]

Hore! 🎉 API kita sudah bisa ngomong sama database!

Coba juga GET ke https://localhost:7000/api/kategori/1 untuk mengambil satu kategori.


💡 Kalau error, cek beberapa hal:
  • Pastikan SQL Server sedang berjalan.
  • Pastikan connection string benar.
  • Pastikan tabel dan data ada di database.
  • Pastikan sudah install package EF Core yang benar.

Bonus: Mengambil Data Wisata dengan Kategorinya

Coba buat controller untuk DaftarWisata yang menampilkan juga nama kategorinya. Buat controller baru: WisataController.cs.

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using WisataAPI.Data;
using WisataAPI.Models;

namespace WisataAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class WisataController : ControllerBase
    {
        private readonly WisataDbContext _context;

        public WisataController(WisataDbContext context)
        {
            _context = context;
        }

        [HttpGet]
        public async Task<ActionResult<IEnumerable<DaftarWisata>>> GetWisata()
        {
            // Include() digunakan untuk mengambil data kategori sekaligus
            return await _context.DaftarWisata
                .Include(w => w.Kategori)
                .ToListAsync();
        }
    }
}

Include(w => w.Kategori) itu seperti bilang ke EF: "Tolong ambilkan juga data kategorinya ya, jangan Id-nya doang." [citation:6]

Uji dengan Postman ke https://localhost:7000/api/wisata. Hasilnya akan menyertakan objek kategori di dalam setiap data wisata.

Apa Selanjutnya?

Alhamdulillah! API kita sudah terhubung dengan database. Sekarang kita bisa baca data dari database.

Di artikel berikutnya (ASP.NET Core API #5), kita akan membuat CRUD lengkap untuk Kategori Wisata. Kita akan bisa nambah (POST), ubah (PUT), hapus (DELETE) data kategori langsung dari Postman. Seru banget!

😴 Udah dulu ya, capek ngoding. Jangan lupa istirahat, main kelereng, atau nonton kartun. Sampai jumpa di artikel selanjutnya!

Ditulis oleh Kakak programmer yang dulu juga bingung bedain DbSet dan DataSet. Kalau ada pertanyaan, tulis di komentar ya!

Lebih baru Lebih lama

نموذج الاتصال