Adakah yang punya saran tentang cara paling efisien untuk menerapkan logika "perbarui baris jika ada orang lain yang menyisipkan" menggunakan Entity Framework?
c#
entity-framework
Jonathan Wood
sumber
sumber
Jawaban:
Jika Anda bekerja dengan objek terlampir (objek dimuat dari instance konteks yang sama) Anda cukup menggunakan:
Jika Anda dapat menggunakan pengetahuan apa pun tentang kunci objek, Anda dapat menggunakan sesuatu seperti ini:
Jika Anda tidak dapat memutuskan keberadaan objek dengan ID Anda, Anda harus memeriksa permintaan pencarian:
sumber
using
blok pendek . Apakah saya tetap bisa meninggalkan konteks dalam memori untuk sementara waktu? Misalnya, selama masa pakai formulir Windows? Saya biasanya mencoba dan membersihkan objek database untuk memastikan beban minimum pada database. Apakah tidak ada masalah menunggu untuk menghancurkan konteks EF saya?Pada Entity Framework 4.3, ada
AddOrUpdate
metode di namespaceSystem.Data.Entity.Migrations
:yang oleh dokter :
Untuk menjawab komentar oleh @ Smashing1978 , saya akan menempel bagian yang relevan dari tautan yang disediakan oleh @Colin
Yang mengatakan, saya memiliki situasi di mana saya menarik data dari layanan eksternal dan memasukkan atau memperbarui nilai yang ada dengan kunci primer (dan data lokal saya untuk konsumen hanya baca) - telah menggunakan
AddOrUpdate
dalam produksi selama lebih dari 6 bulan sekarang dan seterusnya Sejauh ini tidak ada masalah.sumber
Keajaiban terjadi ketika menelepon
SaveChanges()
dan tergantung pada arusEntityState
. Jika entitas memilikiEntityState.Added
, maka akan ditambahkan ke database, jika memilikiEntityState.Modified
, maka akan diperbarui dalam database. Jadi, Anda dapat menerapkanInsertOrUpdate()
metode sebagai berikut:Lebih lanjut tentang EntityState
Jika Anda tidak dapat memeriksa
Id = 0
untuk menentukan apakah itu entitas baru atau tidak, periksa jawaban Ladislav Mrnka .sumber
Jika Anda tahu bahwa Anda menggunakan konteks yang sama dan tidak melepaskan entitas apa pun, Anda dapat membuat versi generik seperti ini:
db
tentu saja bisa menjadi bidang kelas, atau metode ini dapat dibuat statis dan ekstensi, tetapi ini adalah dasar-dasarnya.sumber
Jawaban Ladislav sudah dekat tetapi saya harus membuat beberapa modifikasi agar ini dapat bekerja di EF6 (database-first). Saya memperluas konteks data saya dengan metode AddOrUpdate saya dan sejauh ini tampaknya berfungsi baik dengan objek terpisah:
sumber
Menurut pendapat saya, perlu untuk mengatakan bahwa dengan EntityGraphOperations yang baru dirilis untuk Kode Kerangka Kerja Entitas Pertama, Anda dapat menyelamatkan diri dari menulis beberapa kode berulang untuk menentukan status semua entitas dalam grafik. Saya adalah penulis produk ini. Dan saya telah menerbitkannya di github , proyek kode ( termasuk demonstrasi langkah demi langkah dan proyek sampel siap untuk diunduh) dan nuget .
Ini akan secara otomatis mengatur status entitas ke
Added
atauModified
. Dan Anda akan secara manual memilih entitas mana yang harus dihapus jika tidak ada lagi.Contoh:
Katakanlah saya sudah mendapatkan
Person
objek.Person
dapat memiliki banyak telepon, Dokumen dan dapat memiliki pasangan.Saya ingin menentukan status semua entitas yang termasuk dalam grafik.
Seperti yang Anda ketahui, properti kunci unik dapat berperan saat menentukan status entitas Telepon. Untuk tujuan khusus seperti itu, kita memiliki
ExtendedEntityTypeConfiguration<>
kelas, yang merupakan warisan dariEntityTypeConfiguration<>
. Jika kita ingin menggunakan konfigurasi khusus seperti itu maka kita harus mewarisi dari kelas pemetaan kitaExtendedEntityTypeConfiguration<>
, bukanEntityTypeConfiguration<>
. Sebagai contoh:Itu saja.
sumber
Sisipkan yang lain perbarui keduanya
sumber
Periksa baris yang ada dengan Apa saja.
sumber
Alternatif untuk jawaban @LadislavMrnka. Ini jika untuk Entity Framework 6.2.0.
Jika Anda memiliki
DbSet
item spesifik dan yang perlu diperbarui atau dibuat:Namun ini juga dapat digunakan untuk generik
DbSet
dengan kunci primer tunggal atau kunci primer komposit.sumber
Dikoreksi
sumber