Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Objek dalam runtime memiliki identitas unik. Dua variabel yang merujuk ke objek yang sama benar-benar merujuk ke instans objek yang sama. Karena fakta ini, perubahan yang Anda buat dengan cara jalur melalui satu variabel segera terlihat melalui variabel lainnya.
Baris dalam tabel database relasional 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 hanya membatasi konten tabel database.
Pada kenyataannya, data paling sering dibawa keluar dari database dan ke tingkat yang berbeda, di mana aplikasi bekerja dengannya. Ini adalah model yang didukung LINQ ke SQL. Ketika data dibawa keluar dari database sebagai baris, Anda tidak memiliki harapan bahwa dua baris yang mewakili data yang sama benar-benar sesuai dengan instans baris yang sama. Jika Anda menanyakan pelanggan tertentu dua kali, Anda mendapatkan dua baris data. Setiap baris berisi informasi yang sama.
Dengan objek, Anda mengharapkan sesuatu yang sangat berbeda. Anda mengharapkan bahwa jika Anda meminta DataContext informasi yang sama berulang kali, itu sebenarnya akan memberi Anda instans objek yang sama. Anda mengharapkan perilaku ini karena objek memiliki arti khusus untuk aplikasi Anda dan Anda mengharapkannya berulah seperti objek. Anda merancangnya sebagai hierarki atau grafik. Anda berharap untuk memperolehnya seperti itu dan tidak menerima banyak sekali instance yang direplikasi hanya karena Anda memintanya berulang kali.
Di LINQ ke SQL, DataContext mengelola identitas objek. Setiap kali Anda mengambil baris baru dari database, baris dicatat dalam tabel identitas oleh kunci utamanya, dan objek baru dibuat. Setiap kali Anda mengambil baris yang sama tersebut, instans objek asli diberikan kembali kepada aplikasi. Dengan cara DataContext ini menerjemahkan konsep identitas seperti yang dilihat oleh database (yaitu, kunci primer) ke dalam konsep identitas yang dilihat oleh bahasa (yaitu, instans). Aplikasi hanya melihat objek dalam kondisi saat pertama kali diambil. Data baru, jika berbeda, dibuang. Untuk informasi lebih lanjut, lihat Mengambil Objek dari Singgahan Identitas.
LINQ ke SQL menggunakan pendekatan ini untuk mengelola integritas objek lokal untuk mendukung pembaruan optimis. Karena satu-satunya perubahan yang terjadi setelah objek pada awalnya dibuat adalah yang dibuat oleh aplikasi, niat aplikasi jelas. Jika perubahan oleh pihak luar telah terjadi selama periode tersebut, mereka akan diidentifikasi pada saat SubmitChanges()
dipanggil.
Nota
Jika objek yang diminta oleh kueri mudah diidentifikasi karena sudah diambil, tidak ada kueri yang dijalankan. Tabel identitas bertindak sebagai cache dari semua objek yang diambil sebelumnya.
Contoh
Contoh Cache Objek 1
Dalam contoh ini, jika Anda menjalankan kueri yang sama dua kali, Anda menerima referensi ke objek yang sama dalam memori setiap kali.
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 Cache Objek 2
Dalam contoh ini, jika Anda menjalankan kueri berbeda yang mengembalikan baris yang sama dari database, Anda menerima referensi ke objek yang sama dalam memori setiap kali.
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