Entity Framework Part 6

Posted by Kamarudin • 4 minute read • Comments

Pada postingan sebelumnya kita sudah membahas bagaimana Entity Framework menangani sebuah tabel tunggal. Pada kenyataannya hampir semua aplikasi database menggunakan lebih dari satu tabel dan tentunya diantara tabel ini juga mempunyai hubungan (relasi).

Di postingan kali ini kita akan membahas bagaimana Entity Framework menangani dua buah tabel yang saling berhubungan yaitu Beli dan ItemBeli.

4

Untuk tabel Supplier dan Barang kita abaikan dulu walaupun kedua tabel ini juga terhubung ke tabel Beli dan ItemBeli.

Proses pembelian di dalam sebuah aplikasinya biasa masuk ke dalam modul transaksi. Ada sebuah proses yang penting ketika akan menyimpan data berupa transaksi, apalagi jika data tersebut saling berhubungan.

Proses ini dikenal dengan istilah transaction, dan salah satu poin pentingnya adalah atomic, yaitu beberapa perintah dianggap sebagai satu kesatuan. Kalau satu gagal, yang lain harus dibatalkan. Contoh pada saat transaksi pembelian proses yang terjadi adalah :

  1. Insert 1 kali ke tabel Beli
  2. Insert n kali ke tabel ItemBeli
  3. Menambah stok barang (tidak di bahas di postingan ini), karena bisa juga diselesaikan dengan database trigger

Ketika insert ke tabel ItemBeli gagal, maka tabel Belinya juga harus di batalkan (undo), klo enggak ya datanya jadi enggak konsisten dong, ada nota Beli yang enggak ada item belinya.

Nah kabar gembiranya Entity Framework secara default sudah mendukung transaction.

Untuk membuat class entity Barang dan ItemBeli berikut class mappingnya sudah tidak dibahas lagi disini, karena saya menggunakan Entity Framework Power Tools.

Sebelum kita lanjut ke pembahasan kode program, kita lihat dulu class entity diagram ke empat tabel di atas.

1

Independent association dan Foreign key association

Hubungan dua buah entity atau lebih dikenal dengan istilah asosiasi (association). Asosiasi ini mencakup one-to-one, one-to-many dan many-to-many.

Dari sisi pemrograman Entity Framework, diperkenalkan lagi dua jenis asosiasi. Yang pertama dikenal dengan istilah independent association, asosiasi ini sudah diperkenalkan sejak Entity Framework versi awal, dan untuk memudahkan kita sebagai pengembang aplikasi, mulai Entity Framework versi 4, tim Entity Framework menambahkan asosiasi kedua yaitu foreign key association.

Dari kedua asosiasi di atas, implementasi foreign key association lebih disarankan dibandingkan independent association, sehingga untuk kode Entity Framework di bawah ini kita juga menggunakan foreign key association :grin:.

Untuk informasi lebih lanjut mengenai Independent association dan Foreign key association bisa merujuk ke referensi berikut :

Seperti postingan sebelumnya, saya akan menuliskan 2 versi kode sebagai bahan perbandingan yaitu menggunakan ADO.NET secara langsung dan Entity Framework.

Nama method yang akan kita gunakan untuk menambahkan data beli berikut itemnya adalah AddPembelian. Method ini akan menambahkan data di dua tabel sekaligus (Beli dan ItemBeli), sehingga sangat disarankan menggunakan database transaction.

Untuk ADO.NET fitur transaction harus ditambahkan secara manual, sedangkan Entity Framework secara default sudah menerapkan fitur transaction.

ADO.NET

private static int AddPembelianUsingADONET(Beli beli)
{
    var result = 0;

    using (var conn = GetOpenConnection())
    {

        try
        {
            // mulai transaksi
            var transaction = conn.BeginTransaction();

            var sql = @"INSERT INTO Beli (Nota, SupplierID, Tanggal, Keterangan)
                        VALUES (@1, @2, @3, @4)";

            // insert ke tabel beli
            using (var cmd = new SqlCommand(sql, conn, transaction))
            {
                cmd.Parameters.AddWithValue("@1", beli.Nota);
                cmd.Parameters.AddWithValue("@2", beli.SupplierID);
                cmd.Parameters.AddWithValue("@3", beli.Tanggal);
                cmd.Parameters.AddWithValue("@4", beli.Keterangan);

                result = cmd.ExecuteNonQuery();
            }

            sql = @"INSERT INTO ItemBeli (Nota, BarangID, Jumlah, HargaBeli, HargaJual)
                    VALUES (@1, @2, @3, @4, @5)";

            // insert ke tabel item beli sebanyak n item
            foreach (var item in beli.ItemBelis)
            {
                using (var cmd = new SqlCommand(sql, conn, transaction))
                {
                    cmd.Parameters.AddWithValue("@1", beli.Nota);
                    cmd.Parameters.AddWithValue("@2", item.BarangID);
                    cmd.Parameters.AddWithValue("@3", item.Jumlah);
                    cmd.Parameters.AddWithValue("@4", item.HargaBeli);
                    cmd.Parameters.AddWithValue("@5", item.HargaJual);

                    result = cmd.ExecuteNonQuery();
                }
            }                    

            // transaksi selesai
            // simpan perubahan secara permanen
            transaction.Commit();

            result = 1; // status transaksi berhasil
        }
        catch
        {
            result = 0;
        }
    }

    return result;
}

Entity Framework

Menggunakan Entity Framework ternyata sangat mudah, coba lihat kode berikut setara dengan kode ADO.NET di atas :)

private static int AddPembelianUsingEF(Beli beli)
{
    var result = 0;

    using (var db = new RetailContext())
    {
        try
        {
            db.Entry(beli).State = EntityState.Added;
            db.SaveChanges();

            result = 1;
        }
        catch
        {
        }
    }

    return result;
}

Contoh penggunaan :

// buat objek item beli (3 objek)
var item1 = new ItemBeli
{
    BarangID = "BB-7421",
    Jumlah = 5,
    HargaBeli = 54,
    HargaJual = 60
};

var item2 = new ItemBeli
{
    BarangID = "BB-8107",
    Jumlah = 7,
    HargaBeli = 101,
    HargaJual = 110
};

var item3 = new ItemBeli
{
    BarangID = "BK-M18B-44",
    Jumlah = 10,
    HargaBeli = 540,
    HargaJual = 693
};

// buat objek beli
var beli = new Beli
{
    Nota = "N001",
    SupplierID = 3,
    Tanggal = DateTime.Today,
    Keterangan = "Transaksi beli menggunakan Entity Framework"
};

// tambahkan item beli ke objek beli
beli.ItemBelis.Add(item1);
beli.ItemBelis.Add(item2);
beli.ItemBelis.Add(item3);

var result = AddPembelianUsingEF(beli);

Console.WriteLine("\nStatus transaksi : {0}", result == 1 ? "Sukses" : "Gagal");

1

2

3

Tabel Beli terhubung dengan tabel Supplier, sehingga Supplier dengan ID 3 harus sudah ada di tabel Supplier. Begitu juga dengan table ItemBeli yang terhubung dengan tabel Barang, sehingga Barang dengan ID BB-7421, BB-8107 dan BK-M18B-44 juga harus ada di tabel Barang.

Selamat MENCOBA :blush:

Comments