Bagikan melalui


Status Objek dan Pelacakan Perubahan

Objek LINQ to SQL objek selalu ikut serta dalam beberapa status. Misalnya, ketika LINQ to SQL membuat objek baru, objek dalam Unchanged status . Objek baru yang Anda buat sendiri tidak diketahui oleh DataContext dan dalam Untracked status . Setelah eksekusi SubmitChanges berhasil , semua objek yang diketahui LINQ to SQL berada dalam Unchanged status . (Satu pengecualian diwakili oleh yang telah berhasil dihapus dari database, yang dalam Deleted status dan tidak dapat digunakan dalam DataContext instans tersebut)

Status Objek

Tabel berikut mencantumkan status yang mungkin untuk objek LINQ to SQL.

Provinsi Deskripsi
Untracked Objek yang tidak dilacak oleh LINQ to SQL. Contohnya termasuk berikut ini:

- Objek yang tidak diminta saat ini melalui DataContext(seperti objek yang baru dibuat).
Objek yang dibuat melalui deserialisasi
- Objek yang diminta melalui DataContext yang berbeda.
Unchanged Objek yang diambil dengan menggunakan DataContext saat ini dan tidak diketahui telah dimodifikasi sejak pembuatannya.
PossiblyModified Objek yang melekat pada DataContext. Untuk informasi lebih lanjut, lihat Pengambilan Data dan Operasi CUD pada Aplikasi Tingkat N (LINQ to SQLSQL).
ToBeInserted Objek yang tidak diambil dengan menggunakan DataContext saat ini. Ini membentuk database INSERT selama SubmitChanges.
ToBeUpdated Sebuah objek yang diketahui telah dimodifikasi sejak pengambilannya. Ini membentuk database UPDATE selama SubmitChanges.
ToBeDeleted Objek yang ditandai untuk dihapus, membentuk database DELETE selama SubmitChanges.
Deleted Objek yang telah dihapus dalam database. Status ini bersifat final dan tidak memungkinkan transisi tambahan.

Menyisipkan Objek

Anda dapat dengan tegas meminta Inserts dengan menggunakan InsertOnSubmit. Atau, LINQ to SQL dapat menilai Inserts dengan menemukan objek yang terhubung ke salah satu objek yang diketahui harus diperbarui. Misalnya, jika Anda menambahkan Untracked objek ke EntitySet<TEntity> atau mengatur EntityRef<TEntity> ke objek Untracked, Anda membuat Untracked objek dapat dijangkau melalui objek terlacak dalam grafik. Saat memproses SubmitChanges, LINQ to SQL melintasi objek yang dilacak dan menemukan objek persisten yang dapat dijangkau yang tidak dilacak. Objek tersebut adalah kandidat untuk disisipkan ke dalam database.

Untuk kelas dalam hierarki turunan, InsertOnSubmit(o) juga menetapkan nilai anggota yang ditetapkan sebagai diskriminator agar sesuai dengan jenis objek o. Dalam hal jenis yang cocok dengan nilai default diskriminator, tindakan ini menyebabkan nilai diskriminator ditimpa dengan nilai default. Untuk informasi selengkapnya, lihat Dukungan Pewarisan.

Penting

Objek yang ditambahkan ke Table tidak ada dalam cache identitas. Cache identitas hanya mencerminkan apa yang diambil dari database. Setelah eksekusi pada InsertOnSubmit, entitas yang ditambahkan tidak muncul dalam kueri terhadap database sampai SubmitChanges berhasil diselesaikan.

Menghapus Objek

Anda menandai objek terlacak o untuk dihapus dengan memanggil DeleteOnSubmit(o) pada Table<TEntity> yang sesuai. LINQ to SQL mempertimbangkan penghapusan objek dari EntitySet<TEntity> sebagai operasi pembaruan, dan nilai kunci asing yang sesuai diatur ke null. Target operasi (o) tidak dihapus dari tabelnya. Misalnya, cust.Orders.DeleteOnSubmit(ord) menunjukkan pembaruan di mana terputusnya hubungan antara cust dan ord dengan menetapkan kunci asingord.CustomerID menjadi null. Ini tidak menyebabkan penghapusan baris yang terkait dengan ord.

LINQ to SQL melakukan pemrosesan berikut saat objek dihapus (DeleteOnSubmit) dari tabelnya:

  • Ketika SubmitChanges dipanggil, operasi DELETE dijalankan untuk objek tersebut.

  • Penghapusan tidak diterapkan pada objek terkait terlepas dari apakah dimuat. Secara khusus, objek terkait tidak dimuat untuk pembaruan properti hubungan.

  • Setelah berhasil dieksekusi SubmitChanges, objek diatur ke status Deleted . Oleh karena itu, Anda tidak dapat menggunakan objek atau iddi dalamnya DataContext. Cache internal yang dikelola oleh DataContext instans tidak menghilangkan objek baru yang diambil atau ditambahkan, bahkan setelah objek dihapus dalam database.

Anda hanya dapat memintaDeleteOnSubmit pada objek yang dilacak oleh DataContext. Untuk sebuah Untracked objek , Anda harus melakukan permintaan Attach sebelum eksekusi DeleteOnSubmit. Meminta DeleteOnSubmit sebuah objek Untracked akan memunculkan pengecualian.

Catatan

Menghapus objek dari tabel menginstruksikan LINQ to SQL untuk menghasilkan DELETE perintah SQL yang sesuai pada saat SubmitChanges. Tindakan ini tidak menghilangkan objek dari cache atau menerapkan penghapusan pada objek terkait.

Untuk mengklaim id kembali objek yang dihapus, gunakan instans baru DataContext . Untuk pembersihan objek terkait, Anda dapat menggunakan fitur penghapusan kaskade database, atau secara manual menghapus objek terkait.

Objek terkait tidak perlu dihapus dengan urutan khusus (tidak seperti dalam database).

Memperbarui Objek

Anda dapat mendeteksi Updates dengan mengamati pemberitahuan perubahan. Pemberitahuan disediakan melalui PropertyChanging aktivitas di pengatur properti. Ketika LINQ to SQL mendapat laporan tentang perubahan pertama pada objek, LINQ to SQL membuat salinan objek dan menganggap objek tersebut sebagai kandidat untuk menghasilkan Update pernyataan.

Untuk objek yang tidak mengimplementasikan INotifyPropertyChanging, LINQ to SQL menyimpan salinan nilai yang dimiliki objek saat pertama kali diwujudkan. Saat Anda meminta SubmitChanges,LINQ to SQL membandingkan nilai saat ini dan awal untuk memutuskan apakah objek telah diubah.

Untuk pembaruan hubungan, referensi dari turunan hingga induk (yaitu, referensi yang sesuai dengan kunci asing) dianggap sebagai otoritas. Referensi pada arah sebaliknya (yaitu, dari induk ke turunan) adalah opsional. Kelas hubungan (EntitySet<TEntity> dan EntityRef<TEntity>) menjamin referensi dua arah konsisten untuk hubungan one-to-many dan one-to-one. Jika model objek tidak menggunakan EntitySet<TEntity> atau EntityRef<TEntity>, dan jika terdapat referensi berlawanan, Anda bertanggung jawab memastikan agar tetap konsisten dengan referensi selanjutnya ketika hubungan diperbarui.

Jika Anda memperbarui referensi yang diperlukan dan kunci asing yang sesuai, Anda harus memastikan telah disetujui. InvalidOperationException Pengecualian diadakan jika keduanya tidak sinkron pada saat Anda meminta SubmitChanges. Meskipun perubahan nilai kunci asing cukup untuk memengaruhi pembaruan baris dasar, Anda harus mengubah referensi untuk mempertahankan konektivitas grafik objek dan konsistensi hubungan dua arah.

Lihat juga