Entity Framework Part 5

Posted by Kamarudin • 6 minute read • Comments

Setelah selesai melakukan mapping, baik secara manual atau menggunakan tool seperti ADO.NET Entity Data Model Designer dan Entity Framework Power Tools, kita bisa langsung mencoba method-method dasar aplikasi database yang dikenal dengan istilah method CRUD seperti Save, Update, Delete dan Get.

Ingat tujuan kita menggunakan ORM seperti Entity Framework dalam pengembangan aplikasi database adalah agar kita tidak  lagi berhubungan secara langsung dengan database berikut objek-objeknya seperti tabel, view dan objek database lainnya, sehingga bisa lebih fokus ke aturan bisnis dari aplikasi yang sedang dikembangkan.

Dalam paradigma OOP, semuanya adalah objek. Saya, Anda, Customer, Supplier, Product adalah objek.

Ada beberapa keuntungan yang kita dapatkan ketika berhubungan dengan class dan objek :

  • Persistence ignorance - Kita tidak perlu lagi khawatir bagaimana data disimpan ataupun media yang digunakan.
  • Strong typing - Kita tidak perlu lagi melakukan konversi secara manual untuk setiap tipe data kolom/field yang ada di dalam sebuah tabel ketika ingin mengambil nilainya.
  • Compile-time checking - Class mempunyai daftar property, jika kita mengetikkan nama property yang salah, secara langsung akan mendapatkan kompilasi error. Sehingga tidak perlu menjalankan aplikasi untuk mengetahui kesalahan penulisan kode.
  • Ease of development - Editor kode seperti Visual Studio mempunyai fitur IntelliSense untuk mempercepat proses pengembangan aplikasi. IntelliSense memberikan petunjuk kepada pengembang aplikasi tentang daftar property, event dan method yang dimiliki oleh sebuah class. Tetapi jika kita menggunakan DataSet atau DataReader, fitur IntelliSense jadi tidak berfungsi karena penulisan nama field/kolom berbasis teks (string).

Di bawah ini kita akan membandingkan pembuatan method-method CRUD menggunakan library ADO.NET secara langsung dan menggunakan Entity Framework.

Adapun sebagai targetnya adalah tabel Supplier yang diwakili oleh class Supplier.

1

1. Save - Untuk menambahkan data baru

ADO.NET

private static int SaveUsingADONET(Supplier supplier)
{
    var result = 0;            

    using (var conn = GetOpenConnection())
    {
        var sql = @"INSERT INTO Supplier (NamaSupplier, Jalan, Kota)
                    VALUES (@1, @2, @3)";

        using (var cmd = new SqlCommand(sql, conn))
        {
            cmd.Parameters.AddWithValue("@1", supplier.NamaSupplier);
            cmd.Parameters.AddWithValue("@2", supplier.Jalan);
            cmd.Parameters.AddWithValue("@3", supplier.Kota);

            result = cmd.ExecuteNonQuery();
        }
    }

    return result;
}

Entity Framework (EF)

private static int SaveUsingEF(Supplier supplier)
{
    var result = 0;

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

        result = 1;
    }

    return result;
}

Dari dua method di atas, kita bisa melihat bahwa method Save menggunakan Entity Framework (EF) lebih sederhana sehingga mengurangi kesalahan dalam penulisan kode dibandingkan dengan menggunakan ADO.NET secara langsung. Kita tidak lagi menuliskan perintah SQL INSERT yang masih berbasis teks (string).

Contoh penggunaan :

// buat objek supplier
var supplier = new Supplier
{
    NamaSupplier = "Morgan Bike Accessories",
    Jalan = "6387 Scenic Avenue",
    Kota = "Bothell"
};

var result1 = SaveUsingADONET(supplier);
var result2 = SaveUsingEF(supplier);

2. Update - Untuk mengupdate data

ADO.NET

private static int UpdateUsingADONET(Supplier supplier)
{
    var result = 0;

    using (var conn = GetOpenConnection())
    {
        var sql = @"UPDATE Supplier SET NamaSupplier = @1, Jalan = @2, Kota = @3
                    WHERE SupplierID = @4";

        using (var cmd = new SqlCommand(sql, conn))
        {
            cmd.Parameters.AddWithValue("@1", supplier.NamaSupplier);
            cmd.Parameters.AddWithValue("@2", supplier.Jalan);
            cmd.Parameters.AddWithValue("@3", supplier.Kota);
            cmd.Parameters.AddWithValue("@4", supplier.SupplierID);

            result = cmd.ExecuteNonQuery();
        }
    }

    return result;
}

Entity Framework (EF)

private static int UpdateUsingEF(Supplier supplier)
{
    var result = 0;

    using (var db = new RetailContext())
    {
        db.Entry(supplier).State = EntityState.Modified;
        db.SaveChanges();

        result = 1;
    }

    return result;
}

Contoh penggunaan :

// buat objek supplier
var supplier = new Supplier
{
    SupplierID = 34,
    NamaSupplier = "Morgan Bike Accessories",
    Jalan = "6387 Scenic Avenue",
    Kota = "Bothell"
};

var result1 = UpdateUsingADONET(supplier);
var result2 = UpdateUsingEF(supplier);

3. Delete - Untuk menghapus data

ADO.NET

private static int DeleteUsingADONET(Supplier supplier)
{
    var result = 0;

    using (var conn = GetOpenConnection())
    {
        var sql = @"DELETE FROM Supplier
                    WHERE SupplierID = @1";

        using (var cmd = new SqlCommand(sql, conn))
        {
            cmd.Parameters.AddWithValue("@1", supplier.SupplierID);

            result = cmd.ExecuteNonQuery();
        }
    }

    return result;
}

Entity Framework (EF)

private static int DeleteUsingEF(Supplier supplier)
{
    var result = 0;

    using (var db = new RetailContext())
    {
        db.Entry(supplier).State = EntityState.Deleted;
        db.SaveChanges();

        result = 1;
    }

    return result;
}

Contoh penggunaan :

// buat objek supplier
var supplier = new Supplier
{
    SupplierID = 34
};

var result1 = DeleteUsingADONET(supplier);
var result2 = DeleteUsingEF(supplier);

4. GetAll - Untuk menampilkan semua data

Method ini akan mengembalikan kumpulan objek supplier, karena objek suppliernya bisa lebih dari satu maka dibutuhkan sebuah wadah (container) untuk menampung kumpulan objek supplier.

Untuk contoh di bawah ini saya menggunakan objek List untuk menampung kumpulan objek supplier.

ADO.NET

private static IList<Supplier> GetAllUsingADONET()
{
    var daftarSupplier = new List<Supplier>();

    using (var conn = GetOpenConnection())
    {
        var sql = @"SELECT SupplierID, NamaSupplier, Jalan, Kota
                    FROM Supplier
                    ORDER BY NamaSupplier";

        using (var cmd = new SqlCommand(sql, conn))
        {
            using (var dtr = cmd.ExecuteReader())
            {
                while (dtr.Read())
                {
                    var supplier = new Supplier
                    {
                        SupplierID = dtr["SupplierID"] is DBNull ? 0 : (int)dtr["SupplierID"],
                        NamaSupplier = dtr["NamaSupplier"] is DBNull ? string.Empty : (string)dtr["NamaSupplier"],
                        Jalan = dtr["Jalan"] is DBNull ? string.Empty : (string)dtr["Jalan"],
                        Kota = dtr["Kota"] is DBNull ? string.Empty : (string)dtr["Kota"]
                    };

                    daftarSupplier.Add(supplier);
                }
            }
        }
    }

    return daftarSupplier;
}

Contoh penggunaan :

var noUrut = 1;

var daftarSupplier = GetAllUsingADONET();
foreach (var supplier in daftarSupplier)
{
    Console.WriteLine("{0}. {1}", noUrut, supplier.NamaSupplier);

    noUrut++;
}

Entity Framework (EF)

Tidak seperti ADO.NET yang masih menggunakan perintah SQL SELECT untuk mengakses data yang ada di dalam database, Entity Framework menggunakan LINQ.

private static IList<Supplier> GetAllUsingEF()
{
    var daftarSupplier = new List<Supplier>();

    using (var db = new RetailContext())
    {
        daftarSupplier = db.Suppliers
                           .OrderBy(s => s.NamaSupplier)
                           .ToList();
    }

    return daftarSupplier;
}

Contoh penggunaan :

var noUrut = 1;

var daftarSupplier = GetAllUsingEF();
foreach (var supplier in daftarSupplier)
{
    Console.WriteLine("{0}. {1}", noUrut, supplier.NamaSupplier);

    noUrut++;
}

5. GetByName - Untuk menampilkan data berdasarkan nama Supplier

ADO.NET

private static IList<Supplier> GetByNameUsingADONET(string namaSupplier)
{
    var daftarSupplier = new List<Supplier>();

    using (var conn = GetOpenConnection())
    {
        var sql = @"SELECT SupplierID, NamaSupplier, Jalan, Kota
                    FROM Supplier
                    WHERE NamaSupplier LIKE @1
                    ORDER BY NamaSupplier";

        using (var cmd = new SqlCommand(sql, conn))
        {
            cmd.Parameters.AddWithValue("@1", "%" + namaSupplier + "%");

            using (var dtr = cmd.ExecuteReader())
            {
                while (dtr.Read())
                {
                    var supplier = new Supplier
                    {
                        SupplierID = dtr["SupplierID"] is DBNull ? 0 : (int)dtr["SupplierID"],
                        NamaSupplier = dtr["NamaSupplier"] is DBNull ? string.Empty : (string)dtr["NamaSupplier"],
                        Jalan = dtr["Jalan"] is DBNull ? string.Empty : (string)dtr["Jalan"],
                        Kota = dtr["Kota"] is DBNull ? string.Empty : (string)dtr["Kota"]
                    };

                    daftarSupplier.Add(supplier);
                }
            }
        }
    }

    return daftarSupplier;
}

Contoh penggunaan :

var noUrut = 1;

var daftarSupplier = GetByNameUsingADONET("new");
foreach (var supplier in daftarSupplier)
{
    Console.WriteLine("{0}. {1}", noUrut, supplier.NamaSupplier);

    noUrut++;
}

Entity Framework (EF)

private static IList<Supplier> GetByNameUsingEF(string namaSupplier)
{
    var daftarSupplier = new List<Supplier>();

    using (var db = new RetailContext())
    {
        daftarSupplier = db.Suppliers
                           .Where(s => s.NamaSupplier.Contains(namaSupplier))
                           .OrderBy(s => s.NamaSupplier)
                           .ToList();
    }

    return daftarSupplier;
}

Contoh penggunaan :

var noUrut = 1;

var daftarSupplier = GetByNameUsingEF("new");
foreach (var supplier in daftarSupplier)
{
    Console.WriteLine("{0}. {1}", noUrut, supplier.NamaSupplier);

    noUrut++;
}

Dan method terakhir adalah …

6. GetByID - Untuk menampilkan data berdasarkan Supplier ID

Method ini hanya mengembalikan satu objek supplier jika ditemukan, selain itu akan mengembalikan nilai null.

ADO.NET

private static Supplier GetByIDUsingADONET(int supplierID)
{
    Supplier supplier = null;

    using (var conn = GetOpenConnection())
    {
        var sql = @"SELECT SupplierID, NamaSupplier, Jalan, Kota
                    FROM Supplier
                    WHERE SupplierID = @1";

        using (var cmd = new SqlCommand(sql, conn))
        {
            cmd.Parameters.AddWithValue("@1", supplierID);

            using (var dtr = cmd.ExecuteReader())
            {
                if (dtr.Read())
                {
                    supplier = new Supplier();
                    supplier.SupplierID = dtr["SupplierID"] is DBNull ? 0 : (int)dtr["SupplierID"];
                    supplier.NamaSupplier = dtr["NamaSupplier"] is DBNull ? string.Empty : (string)dtr["NamaSupplier"];
                    supplier.Jalan = dtr["Jalan"] is DBNull ? string.Empty : (string)dtr["Jalan"];
                    supplier.Kota = dtr["Kota"] is DBNull ? string.Empty : (string)dtr["Kota"];

                }
            }
        }
    }

    return supplier;
}

Contoh penggunaan :

var supplier = GetByIDUsingADONET(19);
if (supplier != null)
    Console.WriteLine("{0}", supplier.NamaSupplier);

Entity Framework (EF)

private static Supplier GetByIDUsingEF(int supplierID)
{
    Supplier supplier = null;

    using (var db = new RetailContext())
    {
        supplier = db.Suppliers
                     .Where(s => s.SupplierID == supplierID)
                     .SingleOrDefault();
    }

    return supplier;
}

Contoh penggunaan :

var supplier = GetByIDUsingEF(19);
if (supplier != null)
    Console.WriteLine("{0}", supplier.NamaSupplier);

Semua contoh method di atas masih menggunakan access modifier private static karena saya melakukan testingnya langsung di method Main (static void Main). Idealnya semua method di atas disimpan di dalam sebuah class dengan access modifier public.

Dan kesimpulan akhirnya adalah, dengan menggunakan ORM seperti Entity Framework, kita bisa dengan mudah membuat standarisasi penulisan kode untuk mengakses database karena memiliki pola yang sama, yg membedakan hanya nilai Statenya saja.

1

2

3

Selamat MENCOBA :blush:

Comments