Saya telah menjelajahi berbagai metode pengeditan / memperbarui catatan dalam Entity Framework 5 di lingkungan ASP.NET MVC3, tetapi sejauh ini tidak ada yang mencentang semua kotak yang saya butuhkan. Saya akan menjelaskan alasannya.
Saya telah menemukan tiga metode yang akan saya sebutkan pro dan kontra:
Metode 1 - Memuat catatan asli, perbarui setiap properti
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
original.BusinessEntityId = updatedUser.BusinessEntityId;
original.Email = updatedUser.Email;
original.EmployeeId = updatedUser.EmployeeId;
original.Forename = updatedUser.Forename;
original.Surname = updatedUser.Surname;
original.Telephone = updatedUser.Telephone;
original.Title = updatedUser.Title;
original.Fax = updatedUser.Fax;
original.ASPNetUserId = updatedUser.ASPNetUserId;
db.SaveChanges();
}
Pro
- Dapat menentukan properti mana yang berubah
- Tampilan tidak perlu mengandung setiap properti
Cons
- 2 x permintaan pada basis data untuk memuat yang asli lalu memperbaruinya
Metode 2 - Memuat catatan asli, atur nilai yang diubah
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
db.Entry(original).CurrentValues.SetValues(updatedUser);
db.SaveChanges();
}
Pro
- Hanya properti yang dimodifikasi yang dikirim ke database
Cons
- Tampilan harus mengandung setiap properti
- 2 x permintaan pada basis data untuk memuat yang asli lalu memperbaruinya
Metode 3 - Lampirkan catatan yang diperbarui dan setel status ke EntityState.Modified
db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();
Pro
- 1 x permintaan pada basis data untuk memperbarui
Cons
- Tidak dapat menentukan properti mana yang berubah
- Tampilan harus mengandung setiap properti
Pertanyaan
Pertanyaan saya untuk kalian Adakah cara yang bersih untuk mencapai serangkaian tujuan ini?
- Dapat menentukan properti mana yang berubah
- Tampilan tidak perlu mengandung setiap properti (seperti kata sandi!)
- 1 x permintaan pada basis data untuk memperbarui
Saya mengerti ini hal yang cukup kecil untuk ditunjukkan tetapi saya mungkin kehilangan solusi sederhana untuk ini. Jika tidak metode satu akan menang ;-)
sumber
Jawaban:
Anda mencari:
sumber
Saya sangat suka jawaban yang diterima. Saya percaya ada cara lain untuk mendekati ini juga. Katakanlah Anda memiliki daftar properti yang sangat pendek yang tidak ingin Anda sertakan dalam Tampilan, jadi saat memperbarui entitas, properti itu akan dihilangkan. Katakanlah kedua bidang tersebut adalah Kata Sandi dan SSN.
Contoh ini memungkinkan Anda untuk secara esensial meninggalkan logika bisnis Anda sendiri setelah menambahkan bidang baru ke tabel Pengguna Anda dan ke Tampilan Anda.
sumber
sumber
Saya telah menambahkan metode pembaruan tambahan ke kelas dasar repositori saya yang mirip dengan metode pembaruan yang dihasilkan oleh Scaffolding. Alih-alih mengatur seluruh objek untuk "dimodifikasi", ia menetapkan serangkaian properti individu. (T adalah parameter generik kelas.)
Dan kemudian menelepon, misalnya:
Saya suka sekali perjalanan ke database. Mungkin lebih baik melakukan ini dengan model tampilan, untuk menghindari pengulangan set properti. Saya belum melakukan itu karena saya tidak tahu bagaimana menghindari membawa pesan validasi pada model tampilan saya, validator ke dalam proyek domain saya.
sumber
sumber
set
bagian dari pernyataan pembaruan.Hanya untuk menambah daftar opsi. Anda juga dapat mengambil objek dari database, dan menggunakan alat pemetaan otomatis seperti Pemeta Otomatis untuk memperbarui bagian dari catatan yang ingin Anda ubah ..
sumber
Tergantung pada kasus penggunaan Anda, semua solusi di atas berlaku. Ini adalah bagaimana saya biasanya melakukannya:
Untuk kode sisi server (misalnya proses batch), saya biasanya memuat entitas dan bekerja dengan proxy dinamis. Biasanya dalam proses batch Anda perlu memuat data kapan saja pada saat layanan berjalan. Saya mencoba untuk memuat data daripada menggunakan metode find untuk menghemat waktu. Tergantung pada proses saya menggunakan kontrol konkurensi optimis atau pesimis (saya selalu menggunakan optimis kecuali untuk skenario eksekusi paralel di mana saya perlu mengunci beberapa catatan dengan pernyataan sql biasa, ini jarang terjadi). Tergantung pada kode dan skenario dampaknya dapat dikurangi menjadi hampir nol.
Untuk skenario sisi klien, Anda memiliki beberapa opsi
Gunakan model tampilan. Model harus memiliki properti UpdateStatus (tidak dimodifikasi-dimasukkan-diperbarui-dihapus). Adalah tanggung jawab klien untuk menetapkan nilai yang benar ke kolom ini tergantung pada tindakan pengguna (masukkan-perbarui-hapus). Server dapat meminta db untuk nilai-nilai asli atau klien harus mengirim nilai-nilai asli ke server bersama dengan baris yang diubah. Server harus melampirkan nilai-nilai asli dan menggunakan kolom UpdateStatus untuk setiap baris untuk memutuskan bagaimana menangani nilai-nilai baru. Dalam skenario ini saya selalu menggunakan konkurensi optimis. Ini hanya akan melakukan memasukkan - memperbarui - menghapus pernyataan dan tidak memilih, tetapi mungkin perlu beberapa kode pintar untuk berjalan grafik dan memperbarui entitas (tergantung pada skenario Anda - aplikasi). Seorang mapper dapat membantu tetapi tidak menangani logika CRUD
Gunakan perpustakaan seperti wind.js yang menyembunyikan sebagian besar kompleksitas ini (seperti yang dijelaskan dalam 1) dan mencoba menyesuaikannya dengan case use Anda.
Semoga ini bisa membantu
sumber