Saya menggunakan Entity Framework untuk mengisi kontrol kisi. Terkadang ketika saya melakukan pembaruan, saya mendapatkan kesalahan berikut:
Simpan pembaruan, masukkan, atau hapus pernyataan yang memengaruhi jumlah baris yang tidak terduga (0). Entitas mungkin telah dimodifikasi atau dihapus karena entitas dimuat. Segarkan entri ObjectStateManager.
Saya tidak tahu bagaimana cara mereproduksi ini. Tapi mungkin ada hubungannya dengan seberapa dekat saya membuat pembaruan. Adakah yang melihat ini atau apakah ada yang tahu apa yang dimaksud dengan pesan kesalahan?
Sunting: Sayangnya saya tidak lagi bebas untuk mereproduksi masalah yang saya alami di sini, karena saya menjauh dari proyek ini dan tidak ingat apakah saya akhirnya menemukan solusi, jika pengembang lain memperbaikinya, atau jika saya mengatasinya. Karena itu saya tidak dapat menerima jawaban apa pun.
sumber
Request.Uri
untuk melihat URL permintaan yang sebenarnya. Dalam kasus saya, saya memiliki beberapa logika pelacakan yang mengenai situs saya dan tidak perlu memuat konteks dari DB (dan kadang-kadang memperbaruinya juga). Jadi, halaman sebenarnya yang saya debugging memiliki data yang diinjak oleh logika kode pelacakan bodoh.Jawaban:
Itu adalah efek samping dari fitur yang disebut optimistic concurrency.
Tidak 100% yakin cara mengaktifkan / menonaktifkannya di Entity Framework tetapi pada dasarnya apa yang dikatakannya adalah bahwa antara saat Anda mengambil data dari database dan ketika Anda menyimpan perubahan, orang lain telah mengubah data (Yang berarti ketika Anda pergi untuk menyimpannya 0 baris benar-benar diperbarui). Dalam istilah SQL, klausa
update
kueri merekawhere
berisi nilai asli dari setiap bidang di baris, dan jika 0 baris terpengaruh, ia tahu ada yang salah.Gagasan di baliknya adalah bahwa Anda tidak akan berakhir menimpa perubahan yang aplikasi Anda tidak tahu telah terjadi - itu pada dasarnya adalah langkah keamanan kecil yang dilemparkan oleh .NET pada semua pembaruan Anda.
Jika konsisten, kemungkinan itu terjadi dalam logika Anda sendiri (EG: Anda benar-benar memperbarui data sendiri dengan metode lain di antara seleksi dan pembaruan), tetapi itu bisa menjadi kondisi balapan antara dua aplikasi.
sumber
Saya berlari ke ini dan itu disebabkan oleh bidang ID (kunci) entitas tidak disetel. Jadi ketika konteksnya pergi untuk menyimpan data, itu tidak dapat menemukan ID = 0. Pastikan untuk menempatkan titik istirahat dalam pernyataan pembaruan Anda dan memverifikasi bahwa ID entitas telah ditetapkan.
Dari komentar Paul Bellora
sumber
Wow, banyak jawaban, tetapi saya mendapatkan kesalahan ini ketika saya melakukan sesuatu yang sedikit berbeda yang tidak disebutkan oleh orang lain.
Singkatnya, jika Anda membuat objek baru dan memberi tahu EF bahwa itu dimodifikasi menggunakan
EntityState.Modified
maka itu akan membuang kesalahan ini karena belum ada dalam database. Ini kode saya:Ya, ini kelihatannya bodoh, tetapi ini muncul karena metode yang dulu digunakan
foo
untuk itu telah dibuat sebelumnya, sekarang hanyasomeValue
diteruskan dan diciptakanfoo
sendiri.Perbaikan mudah, cukup ubah
EntityState.Modified
keEntityState.Added
atau perubahan yang seluruh baris ke:sumber
Saya menghadapi kesalahan menakutkan yang sama ... :) Kemudian saya menyadari bahwa saya lupa untuk mengatur a
@Html.HiddenFor(model => model.UserProfile.UserId)
untuk kunci utama objek yang diperbarui! Saya cenderung melupakan hal yang sederhana, tetapi sangat penting ini!
By the way:
HiddenFor
adalah untuk ASP.NET MVC.sumber
UserId
dalam bentuk, sangat rentan terhadap peretas ... ini harus dihuni setelahnya dariHttpContext.Current.User.Identity.Name
HiddenFor
Anda harus mendapatkannya dariHttpContext
anyways ... Saya tidak akan menempatkan properti ini dalam bentuk sama sekali, yang akan memaksa saya untuk selalu mengisi sisi server ...Periksa apakah Anda lupa atribut "DataKeyNames" di GridView. itu adalah suatu keharusan ketika memodifikasi data dalam GridView
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspx
sumber
Masalah ini disebabkan oleh salah satu dari dua hal: -
Concurrency Mode: Fixed
.. dan Optimistic Concurrency mencegah data disimpan. Yaitu. beberapa mengubah data baris antara saat Anda menerima data server dan ketika Anda menyimpan data server Anda.StoreGeneratedPattern = Computed
) Dan baris itu tidak ada.sumber
Saya mendapat kesalahan yang sama ini karena bagian dari PK adalah kolom datetime, dan catatan yang dimasukkan menggunakan DateTime. Sekarang sebagai nilai untuk kolom itu. Kerangka kerja entitas akan memasukkan nilai dengan presisi milidetik, dan kemudian mencari nilai yang baru saja dimasukkan juga dengan presisi milidetik. Namun SqlServer telah membulatkan nilai ke presisi kedua, dan dengan demikian kerangka kerja tidak dapat menemukan nilai presisi milidetik.
Solusinya adalah memotong milidetik dari DateTime. Sekarang sebelum memasukkan.
sumber
Date
kolom denganDateTime
nilaiSaya mengalami masalah yang sama dan jawaban @ webtrifusion membantu menemukan solusinya.
Model saya menggunakan
Bind(Exclude)
atribut pada ID entitas yang menyebabkan nilai ID entitas menjadi nol pada HttpPost.sumber
Saya memiliki masalah yang sama, saya mencari tahu yang disebabkan oleh RowVersion yang nol. Periksa Anda Id dan Anda RowVersion yang tidak null .
untuk informasi lebih lanjut lihat tutorial ini
http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-w----ity-framework-in-an-asp-net-mvc-application
sumber
Saya mulai mendapatkan kesalahan ini setelah berubah dari model-pertama ke kode-pertama. Saya memiliki beberapa utas memperbarui basis data di mana beberapa mungkin memperbarui baris yang sama. Saya tidak tahu mengapa saya tidak punya masalah menggunakan model-pertama, asumsikan bahwa ia menggunakan default konkurensi yang berbeda.
Untuk mengatasinya di satu tempat mengetahui kondisi di mana itu mungkin terjadi, saya menambahkan overload berikut ke kelas DbContext saya:
Kemudian dipanggil
SaveChanges(true)
dimanapun berlaku.sumber
Anda harus secara eksplisit menyertakan BoundField dari kunci utama. Jika Anda tidak ingin pengguna melihat kunci utama, Anda harus menyembunyikannya melalui css:
Di mana 'hidden' adalah kelas dalam css yang tampilannya diatur ke 'tidak ada'.
sumber
Saat mengedit, sertakan id atau kunci utama entitas sebagai bidang tersembunyi dalam tampilan
yaitu
yang memecahkan masalah.
Juga jika model Anda menyertakan item yang tidak digunakan juga termasuk itu dan mengirimkannya ke controller
sumber
Saya juga menemukan kesalahan ini. Masalahnya ternyata disebabkan oleh Pemicu di atas meja yang saya coba selamatkan. Trigger menggunakan 'INSTEAD OF INSERT' yang berarti 0 baris pernah dimasukkan ke tabel itu, karenanya kesalahan. Untungnya dalam kasus fungsi pemicu tidak benar, tapi saya kira itu bisa menjadi operasi yang valid yang entah bagaimana harus ditangani dalam kode. Semoga ini bisa membantu seseorang suatu hari.
sumber
SELECT SCOPE_IDENTITY() as MyViewId
Saya menemukan masalah ini pada tabel yang tidak memiliki kunci utama dan memiliki kolom DATETIME (2, 3) (jadi "kunci utama" entitas adalah kombinasi dari semua kolom) ... Saat melakukan penyisipan timestamp memiliki waktu yang lebih tepat (2018-03-20 08: 29: 51.8319154) yang terpotong menjadi (2018-03-20 08: 29: 51.832) sehingga pencarian pada bidang kunci gagal.
sumber
Saya juga mengalami kesalahan ini. Ada beberapa situasi di mana Entitas mungkin tidak menyadari Konteks Database aktual yang Anda gunakan atau Model mungkin berbeda. Untuk ini, set: EntityState.Modified; untuk EntityState. Ditambahkan;
Untuk melakukan ini:
Ini akan memastikan Entitas tahu Anda menggunakan atau menambahkan Negara tempat Anda bekerja. Pada titik ini semua Nilai Model yang benar harus ditetapkan. Berhati-hatilah untuk tidak kehilangan perubahan apa pun yang mungkin telah dibuat di latar belakang.
Semoga ini membantu.
sumber
Versi baris saya adalah nol, jadi harus menambahkan ini ke tampilan yang memecahkan masalah saya
sumber
Garis
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None)]
melakukan trik dalam kasus saya:sumber
Pastikan saja tabel dan formulir keduanya memiliki kunci utama dan edmx diperbarui.
saya menemukan bahwa setiap kesalahan selama pembaruan biasanya karena: - Tidak ada kunci utama dalam Tabel - Tidak ada kunci utama dalam Edit tampilan / formulir (misalnya
@Html.HiddenFor(m=>m.Id
)sumber
Saya memiliki masalah yang sama. Dalam kasus saya, saya mencoba memperbarui kunci utama, yang tidak diizinkan.
sumber
Saya mendapatkan kesalahan ini secara sporadis saat menggunakan
async
metode. Belum terjadi sejak saya beralih ke metode sinkron.Kesalahan secara sporadis:
Bekerja sepanjang waktu:
sumber
Saya mendapatkan kesalahan itu ketika saya menghapus beberapa baris dalam DB (dalam loop), dan menambahkan yang baru di tabel yang sama.
Solusi bagi saya adalah, secara dinamis membuat konteks baru di setiap iterasi loop
sumber
sumber
Ini juga akan terjadi jika Anda mencoba memasukkan ke dalam situasi kendala yang unik, yaitu jika Anda hanya dapat memiliki satu jenis alamat per majikan dan Anda mencoba memasukkan yang kedua dari jenis yang sama dengan majikan yang sama, Anda akan mendapatkan masalah yang sama .
ATAU
Ini juga bisa terjadi jika semua properti objek yang ditugaskan, mereka ditugaskan dengan nilai yang sama seperti sebelumnya.
sumber
Jika Anda mencoba membuat pemetaan di file edmx ke "fungsi Impor", ini dapat menyebabkan kesalahan ini. Cukup kosongkan bidang untuk disisipkan, perbarui dan hapus yang terletak di Rincian Pemetaan untuk entitas tertentu di edmx Anda, dan itu akan berfungsi. Saya harap saya membuatnya jelas.
sumber
Saya mendapat pengecualian ini ketika melampirkan objek yang tidak ada di database. Saya mengasumsikan objek dimuat dari konteks yang terpisah, tetapi jika itu adalah pertama kalinya pengguna mengunjungi situs, objek tersebut dibuat dari awal. Kami memiliki kunci primer yang bertambah secara otomatis, jadi saya bisa menggantinya
dengan
sumber
Yah saya punya masalah yang sama. Tapi ini karena kesalahan saya sendiri. Sebenarnya saya menyimpan suatu objek alih-alih menambahkannya. Jadi ini konfliknya.
sumber
Salah satu cara untuk men-debug masalah ini dalam lingkungan Sql Server adalah dengan menggunakan Sql Profiler yang disertakan dengan salinan SqlServer Anda, atau jika menggunakan versi Express, dapatkan salinan Expresser Profileer secara gratis dari CodePlex dengan mengikuti tautan di bawah ini:
Profiler Ekspres
Dengan menggunakan Sql Profiler Anda bisa mendapatkan akses ke apa pun yang dikirim oleh EF ke DB. Dalam kasus saya ini berjumlah:
Saya menyalin ini ke jendela permintaan di Sql Server dan menjalankannya. Cukup yakin, meskipun berjalan, 0 rekaman dipengaruhi oleh kueri ini sehingga kesalahan dikembalikan oleh EF.
Dalam kasus saya, masalahnya disebabkan oleh CategoryID.
Tidak ada CategoryID diidentifikasi oleh ID EF dikirim ke database sehingga 0 catatan terpengaruh.
Ini bukan kesalahan EF, tapi bukan buggy null yang menyatu "??" pernyataan di View Controller yang mengirim omong kosong ke tier data.
sumber
Tidak satu pun dari jawaban di atas yang cukup menutupi situasi saya dan solusi untuk itu.
Kode tempat kesalahan dilemparkan ke controller MVC5:
Saya menerima pengecualian ini ketika saya menyimpan objek dari tampilan Edit. Alasan itu melemparkannya adalah karena ketika saya kembali untuk menyimpannya, saya telah memodifikasi properti yang membentuk kunci utama pada objek. Jadi, mengatur statusnya ke Dimodifikasi tidak masuk akal untuk EF - itu adalah entri baru, bukan entri yang disimpan sebelumnya.
Anda dapat menyelesaikan ini dengan A) memodifikasi panggilan simpan ke Tambahkan objek, atau B) hanya tidak mengubah kunci utama pada edit. Saya melakukan B).
sumber
Ketika jawaban yang diterima mengatakan " itu tidak akan berakhir menimpa perubahan yang aplikasi Anda tidak tahu telah terjadi ", saya ragu karena objek saya baru saja dibuat. Tapi kemudian ternyata, ada
INSTEAD OF UPDATE, INSERT- TRIGGER
lampiran pada tabel yang memperbarui kolom terhitung dari tabel yang sama.Setelah saya mengubah ini
AFTER INSERT, UPDATE
, itu berfungsi dengan baik.sumber
Ini terjadi pada saya karena ketidakcocokan antara datetime dan datetime2. Anehnya, itu bekerja dengan baik sebelum penguji menemukan masalah. Model Kode Pertama Saya menyertakan DateTime sebagai bagian dari kunci utama:
Kolom yang dihasilkan adalah kolom datetime. Saat memanggil SaveChanges, EF menghasilkan SQL berikut:
Karena berusaha mencocokkan kolom datetime dengan nilai datetime2, hasilnya tidak ada. Satu-satunya solusi yang dapat saya pikirkan adalah mengubah kolom menjadi datetime2:
sumber
datetime
vsdatetime2
. Pada dasarnya beberapa nilai milidetik akan mengevaluasi kecocokan, yang lain tidak. Hal yang sama terjadi pada saya dan saya juga beralih keDateTime2
.