August 2011 - Posts

Mencicipi EntityFramework CodeFirst (EF 4.1)

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:

DataPemakaianObat_Diagram.png

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.

Share this post: | | | |