Pada Entity Framework (EF) ada 3 hubungan yang bisa terjadi antara Model dan Database.
Yaitu :
Database First:
Ini yang biasa kita lakukan. Kita menciptakan Model dari Database
yg sudah exist. Biasa disebut juga reverse-engineering.
Model First:
Kita menciptakan Model terlebih dahulu lalu kemudian kita menciptakan
Database dari Model tersebut.
Code First:
Kita menciptakan database dari Code yang kita ketikkan.
Hal yang menarik dari CodeFirst adalah kita bisa menciptakan database dengan
hanya sedikit usaha saja. Fitur ini terdapat dalam EF 4.1.
So, pada postingan kali ini kita akan melakukan semacam walkthrough untuk mencoba CodeFirst.
Bagi yang belum tau bagaimana memanfaatkan code first, pertama sekali kita harus mendownload EF 4.1 disini: http://www.microsoft.com/download/en/details.aspx?id=26825. Setelah itu lakukan penginstalan dan untuk mempergunakannya kita tinggal melakukan add reference ke EntityFramework.dll yang berada pada C:\Program Files (x86)\Microsoft ADO.NET Entity Framework 4.1\Binaries.
Diagram database
Lalu, Anggap misalnya kita mempunyai suatu model database seperti berikut ini:

Diatas adalah diagram Database yang akan kita buat dengan CodeFirst. Itu adalah diagram database DataPemakaianObat pada sebuah rumah sakit. Yang terdiri dari 4 table :
Pasiens:
Merepresentasikan seorang pasien rumah sakit. Pasien mempunyai poperty Diagnosa yg nilainya adalah deskripsi penyakit yang dideritanya.
Alamats:
Merepresentasikan alamat dari pasien.
Obats:
Merepresentasikan suatu obat.
PasienObats:
Pada Pasien dan Obat terdapat suatu hubungan
Many to Many. Untuk itulah table PasienObats exist.
Dan dia mempunyai property Jumlah yang menunjukkan jumlah obat yang diberikan kepada Pasien.
So, database DataPemakaianObat ini akan diisi jika ada seorang pasien dirumah sakit yang diberikan obat.
Menambahkan reference
Jadi, kita sudah mempunyai diagram database yang akan kita bangun dengan CodeFirst.
Lalu sekarang kita menuju ke VisualStudio. Create New ConsoleApps dan add reference ke :
EntityFramework.dll, System.Data.Entity.dll dan System.ComponentModel.DataAnnotations.dll.
Lalu tambahkan perintah using seperti berikut ini :
1: using System.Data.Entity;
2: using System.ComponentModel.DataAnnotations;
Mendefinisikan class DbContext
Selanjutnya kita akan membuat class baru yang menginherit class DbContext. Tambahkan code berikut:
1: public class KonsumsiObatContext : DbContext
2: {
3: public KonsumsiObatContext(string ConnectionString)
4: : base(ConnectionString)
5: { }
6:
7: public DbSet<Pasien> Pasiens { get; set; }
8: public DbSet<Alamat> Alamats { get; set; }
9: public DbSet<Obat> Obats { get; set; }
10: public DbSet<PasienObat> PasienObats { get; set; }
11: }
Pada class KonsumsiObatContext diatas,
kita memanggil base constructor untuk melewatkan sebuah ConnectionString
Mendefinisikan class-class Entity
Selanjutnya, tugas kita adalah mendefinikan class-class Entity,
yaitu : Pasien, Alamat, Obat dan PasienObat.
Class Pasien
Kita mulai saja dengan defenisi class Pasien dengan menambahkan code berikut:
1: public class Pasien
2: {
3: [Key]
4: public int PasienId { get; set; }
5: public string Nama { get; set; }
6: public DateTime Tgl_Lahir { get; set; }
7: public string Kelamin { get; set; }
8: public string Diagnosa { get; set; }
9:
10: //Navigation Property
11: public ICollection<PasienObat> PasienObats { get; set; }
12: public ICollection<Alamat> Alamats { get; set; }
13: }
Pada class Pasien diatas kita menggunakan attribute Key untuk mendefinikan properti
PasienId sebagai PrimaryKey.
Class Alamat
Untuk class Alamat, kita definisikan dengan code berikut:
1: public class Alamat
2: {
3: [Key]
4: public int AlamatId { get; set; }
5: public string Jalan { get; set; }
6: public string Kota { get; set; }
7: public string Provinsi { get; set; }
8: public string Negara { get; set; }
9:
10: //Foreign Key Property
11: public int PasienId { get; set; }
12:
13: //Navigation Property
14: public Pasien Pasien { get; set; }
15: }
Class Obat
Untuk class Obat, kita definisikan dengan code berikut:
1: public class Obat
2: {
3: [Key]
4: public int ObatId { get; set; }
5: public string Nama { get; set; }
6: public int Dosis { get; set; }
7: public string Satuan { get; set; }
8: public string Manufaktur { get; set; }
9: public double Harga { get; set; }
10:
11: //Navigation Property
12: public ICollection<PasienObat> PasienObats { get; set; }
13: }
Class PasienObat
Selanjutnya yang terakhir adalah class PasienObat. class PasienObat ini merepresentasikan Join Table
antara table Pasien dan Obat. Tambahkan code berikut untuk mendefinisikannya:
1: public class PasienObat
2: {
3: //property PasienID yg merupakan ForeignKey
4: //dan bagian dari Composite PrimaryKey
5: [Key]
6: [Column("PasienId", Order = 0)]
7: public int PasienId { get; set; }
8:
9: //property ObatID yg merupakan ForeignKey
10: //dan bagian dari Composite PrimaryKey
11: [Key]
12: [Column("ObatId", Order = 1)]
13: public int ObatId { get; set; }
14:
15: public int Jumlah { get; set; }
16:
17: //Navigation Property
18: public Pasien Pasien { get; set; }
19: public Obat Obat { get; set; }
20: }
Pada class PasienObat diatas, kita harus mendifinisakan urutan dari Composite PrimaryKey.
Kita melakukannya dengan menggunakan attribute Column dan men-set property Order sesuai dengan nilai urutan.
Running the Code
Seperti yang kita lihat diatas, pada dasarnya kita hanya mendefinisikan struktur Model database yang kita inginkan.
Hal ini kita lakukan dengan menggunakan beberapa attribute. Tapi, selain menggunakan attribute masih ada cara lain
untuk melakukannya yaitu dengan menggunakan class DbModelBuilder.
Tapi pada walkthrough ini kita cukup hanya menggunakan Attribute untuk melakukannya dengan tujuan untuk membuatnya ringkas.
Pada saat runtime nanti EntityFramework akan menebak struktur dari Model yang kita definisikan tersebut. Dan jika valid, maka
dia akan meng-compose SQL Commands. Dab SQL Commands ini lah yang akan di
execute untuk meng-create Database.
So, selanjutnya kita tinggal membuat class Program untuk meng-create Database
dari struktur yang sudah kita definisikan diatas. Codenya seperti berikut :
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: var connString = "Data Source=localhost; " +
6: "Initial Catalog=KonsumsiObat; " +
7: "Integrated Security=True; " +
8: "MultipleActiveResultSets=True";
9: using (var context = new KonsumsiObatContext(connString))
10: {
11: if (!context.Database.Exists())
12: {
13: context.Database.Create();
14: Console.WriteLine("Database created");
15: }
16:
17: #region Isi Data
18: var newPasien = new Pasien
19: {
20: Nama = "Joni",
21: Kelamin = "Laki-laki",
22: Diagnosa = "Demam",
23: Tgl_Lahir = DateTime.Parse("05-05-1985")
24:
25: };
26:
27: var newAlamat = new Alamat
28: {
29: Jalan = "Jl. Merdeka No. 55",
30: Kota = "Medan",
31: Provinsi = "Sumatera Utara",
32: Negara = "Indonesia",
33: Pasien = newPasien
34: };
35:
36: var newObat = new Obat
37: {
38: Nama = "Paracetamol Syrup",
39: Manufaktur = "PT. Kimia Farma",
40: Dosis = 60,
41: Satuan = "ml",
42: Harga = 10000
43: };
44:
45: var newPasienObat = new PasienObat
46: {
47: Pasien = newPasien,
48: Obat = newObat,
49: Jumlah = 1
50: };
51:
52: context.Pasiens.Add(newPasien);
53: context.Alamats.Add(newAlamat);
54: context.Obats.Add(newObat);
55: context.PasienObats.Add(newPasienObat);
56: context.SaveChanges();
57: #endregion
58:
59: var pasien = context.Pasiens
60: .Include("Alamats")
61: .Include("PasienObats.Obat")
62: .FirstOrDefault();
63:
64: Console.WriteLine("Nama: {0} \nAlamat: {1} \nObat: {2}",
65: pasien.Nama,
66: pasien.Alamats.First().Kota,
67: pasien.PasienObats.First().Obat.Nama
68: );
69:
70: }
71: }
72: }
Pada code diatas, kita mencreate Database menggunakan object Database yang merupakan property dari object DbContext (Line 13).
Setelah itu seperti yg disebutkan diatas, EntityFramework akan memeriksa struktur dari Model yang kita definisikan dan meng-compose Commands
yang akhirnya diexecute untuk mengcreate Database.
Pada bagian terakhir kita melakukan penginputan data dan melakukan suatu query ke database (Line 17 - line
62) untuk melakukan testing terhadap Database yang baru kita create.
OK. Itulah walkthrough tentang CodeFirst, semoga bermanfaat.