Bagikan melalui


Identitas Objek

Objek dalam runtime bahasa umum memiliki identitas unik. Dua variabel yang merujuk ke objek yang sama sebenarnya merujuk ke instans objek yang sama. Karena fakta ini, perubahan yang Anda buat dengan jalur melalui satu variabel segera terlihat melalui variabel lainnya.

Baris dalam tabel database hubungan tidak memiliki identitas unik. Karena setiap baris memiliki kunci primer yang unik, tidak ada dua baris yang memiliki nilai kunci yang sama. Namun, fakta ini membatasi isi tabel database saja.

Pada kenyataannya, data paling sering dibawa keluar dari database dan ke tingkat yang berbeda, di mana aplikasi bekerja dengannya. Ini adalah model yang didukung oleh LINQ to SQL. Ketika data dibawa keluar dari database sebagai baris, Anda tidak berharap bahwa dua baris yang mewakili data yang sama benar-benar terkait dengan instans baris yang sama. Jika Anda membuat kueri untuk pelanggan tertentu dua kali, Anda mendapatkan dua baris data. Setiap baris berisi informasi yang sama.

Dengan objek, harapan Anda benar-benar berbeda. Anda berharap bahwa jika Anda meminta DataContext untuk informasi yang sama berulang kali, ini akan memberi Anda instans objek yang sama. Anda mengharapkan perilaku ini karena objek memiliki arti khusus untuk aplikasi Anda dan Anda mengharapkannya berperilaku seperti objek. Anda merancangnya sebagai hierarki atau grafik. Anda berharap untuk mengambilnya seperti itu dan tidak menerima banyak instans yang sama hanya karena Anda meminta hal yang sama lebih dari satu kali.

Di LINQ to SQL, DataContext mengelola identitas objek. Setiap kali Anda mengambil baris baru dari database, baris tersebut dicatat dalam tabel identitas berdasarkan kunci primernya, dan objek baru dibuat. Setiap kali Anda mengambil baris yang sama, instans objek asli dikembalikan ke aplikasi. Dengan cara ini, DataContext menerjemahkan konsep identitas seperti yang terlihat oleh database (yaitu, kunci primer) ke dalam konsep identitas yang dilihat oleh bahasa (yaitu, instans). Aplikasi hanya melihat objek dalam status pertama kali objek tersebut diambil. Data baru, jika berbeda, dibuang. Untuk informasi selengkapnya, lihat Mengambil Objek dari Cache Identitas.

LINQ to SQL menggunakan pendekatan ini guna mengelola integritas objek lokal untuk mendukung pembaruan optimis. Karena satu-satunya perubahan yang terjadi setelah objek pertama kali dibuat adalah perubahan yang dibuat oleh aplikasi, niat aplikasi menjadi jelas. Jika perubahan oleh pihak luar telah terjadi untuk sementara, perubahan tersebut diidentifikasi pada saat SubmitChanges() dipanggil.

Catatan

Jika objek yang diminta oleh kueri mudah diidentifikasi sebagai objek yang sudah diambil, tidak ada kueri yang dijalankan. Tabel identitas bertindak sebagai cache dari semua objek yang diambil sebelumnya.

Contoh

Contoh 1 Penembolokan Objek

Dalam contoh ini, jika Anda menjalankan kueri yang sama dua kali, Anda akan selalu menerima referensi ke objek yang sama di memori.

Customer cust1 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();

Customer cust2 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();
Dim cust1 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

Dim cust2 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

Contoh 2 Penembolokan Objek

Dalam contoh ini, jika Anda menjalankan kueri berbeda yang mengembalikan baris yang sama dari database, Anda akan selalu menerima referensi ke objek yang sama di memori.

Customer cust1 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();

Customer cust2 =
    (from ord in db.Orders
     where ord.Customer.CustomerID == "BONAP"
     select ord).First().Customer;
Dim cust1 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

Dim cust2 As Customer = _
    (From ord In db.Orders _
     Where ord.Customer.CustomerID = "BONAP" _
     Select ord).First().Customer

Lihat juga