Saya mencoba memperbarui catatan menggunakan EF6. Pertama-tama menemukan catatan, jika ada, perbarui. Ini kode saya: -
var book = new Model.Book
{
BookNumber = _book.BookNumber,
BookName = _book.BookName,
BookTitle = _book.BookTitle,
};
using (var db = new MyContextDB())
{
var result = db.Books.SingleOrDefault(b => b.BookNumber == bookNumber);
if (result != null)
{
try
{
db.Books.Attach(book);
db.Entry(book).State = EntityState.Modified;
db.SaveChanges();
}
catch (Exception ex)
{
throw;
}
}
}
Setiap kali saya mencoba memperbarui catatan menggunakan kode di atas, saya mendapatkan kesalahan ini: -
{System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Menyimpan pembaruan, menyisipkan, atau menghapus pernyataan memengaruhi jumlah baris yang tidak terduga (0). Entitas mungkin telah dimodifikasi atau dihapus karena entitas dimuat. Segarkan entri ObjectStateManager
c#
entity-framework
entity-framework-6
ef-database-first
pengguna1327064
sumber
sumber
catch (Exception ex){throw;}
berlebihan dan Anda dapat menghapusnya sepenuhnya.Jawaban:
Anda mencoba memperbarui catatan (yang bagi saya berarti "mengubah nilai pada catatan yang ada dan menyimpannya kembali"). Jadi, Anda perlu mengambil objek, membuat perubahan, dan menyimpannya.
sumber
db.SaveChanges()
dengan objek yang diubah dalam konteks memperbarui database.SaveChanges
konteks, evaluasi semua objek yang dilacak untuk menentukan apakah mereka ditambahkan, diubah, atau dihapus dan mengeluarkan SQL yang sesuai untuk database yang terhubung.Saya telah meninjau kode sumber dari Entity Framework dan menemukan cara untuk benar-benar memperbarui entitas jika Anda mengetahui properti Key:
Jika tidak, periksa penerapan AddOrUpdate untuk ide.
Semoga bantuan ini!
sumber
SaveChanges()
panggilan diperlukan setelah menetapkan nilai.Anda dapat menggunakan
AddOrUpdate
metode ini:sumber
.AddOrUpdate()
digunakan selama migrasi basis data, sangat disarankan untuk menggunakan metode ini di luar migrasi, karenanya mengapa ada diEntity.Migrations
namespace.AddOrUpdate()
metode ditujukan untuk migrasi dan itu tidak cocok untuk situasi ketika Anda hanya perlu memperbarui baris yang ada. Dalam kasus ketika Anda tidak memiliki buku dengan referensi pencarian (yaitu ID) itu akan membuat baris baru dan itu bisa menjadi masalah dalam kasus yang akan datang (misalnya, Anda memiliki API yang perlu mengembalikan respons 404-NotFound jika Anda coba panggil metode PUT untuk baris yang tidak ada).Jadi Anda memiliki entitas yang diperbarui, dan Anda ingin memperbaruinya dalam database dengan jumlah kode paling sedikit ...
Konkurensi selalu rumit, tetapi saya berasumsi bahwa Anda hanya ingin pembaruan Anda menang. Inilah cara saya melakukannya untuk kasus yang sama dan memodifikasi nama untuk meniru kelas Anda. Dengan kata lain, hanya mengubah
attach
keadd
, dan bekerja untuk saya:sumber
Anda harus menggunakan metode Entri () jika Anda ingin memperbarui semua bidang di objek Anda. Ingat juga bahwa Anda tidak dapat mengubah id bidang (kunci) karena itu atur Id terlebih dahulu sama dengan yang Anda edit.
sumber
Kode ini adalah hasil dari tes untuk memperbarui hanya satu set kolom tanpa membuat kueri untuk mengembalikan catatan terlebih dahulu. Ia menggunakan kode Entity Framework 7 terlebih dahulu.
Ini kode lengkapnya:
sumber
Untuk .net core
sumber
Berikut adalah solusi terbaik untuk masalah ini: Dalam Tampilan tambahkan semua ID (Tombol). Pertimbangkan memiliki beberapa tabel bernama (Pertama, Kedua, dan Ketiga)
Dalam kode C #,
sumber
Attach
Jika suatu entitas akan mengatur status pelacakannyaUnchanged
. Untuk memperbarui entitas yang ada, yang perlu Anda lakukan adalah mengatur status pelacakanModified
. Menurut dokumen EF6 :sumber
sumber
Saya menemukan cara yang berfungsi dengan baik.
sumber
Anda harus menghapus
db.Books.Attach(book);
sumber
Inilah metode pembaruan entitas post-RIA saya (untuk kerangka waktu Ef6):
Perhatikan bahwa
FrameworkTypeUtility.SetProperties()
ini adalah fungsi utilitas kecil yang saya tulis jauh sebelum AutoMapper di NuGet:sumber
Seperti yang Renat katakan, hapus:
db.Books.Attach(book);
Juga, ubah kueri hasil Anda untuk menggunakan "AsNoTracking", karena kueri ini membuang status model kerangka kerja entitas. Ia berpikir "hasil" adalah buku untuk dilacak sekarang dan Anda tidak menginginkannya.
sumber
Cobalah....
UpdateModel (buku);
sumber
Saya tahu itu sudah dijawab beberapa kali, tetapi saya suka cara ini. Saya harap ini akan membantu seseorang.
sumber
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