Saat menjalankan SubmitChanges ke DataContext setelah memperbarui beberapa properti dengan sambungan LINQ ke SQL (terhadap SQL Server Compact Edition) saya mendapatkan "Baris tidak ditemukan atau diubah." ChangeConflictException.
var ctx = new Data.MobileServerDataDataContext(Common.DatabasePath);
var deviceSessionRecord = ctx.Sessions.First(sess => sess.SessionRecId == args.DeviceSessionId);
deviceSessionRecord.IsActive = false;
deviceSessionRecord.Disconnected = DateTime.Now;
ctx.SubmitChanges();
Kueri menghasilkan SQL berikut ini:
UPDATE [Sessions]
SET [Is_Active] = @p0, [Disconnected] = @p1
WHERE 0 = 1
-- @p0: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p1: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:12:02 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8
Masalah yang jelas adalah WHERE 0 = 1 , Setelah record dimuat, saya telah mengonfirmasi bahwa semua properti di "deviceSessionRecord" sudah benar untuk menyertakan kunci utama. Juga saat menangkap "ChangeConflictException" tidak ada informasi tambahan tentang mengapa ini gagal. Saya juga mengonfirmasi bahwa pengecualian ini dilemparkan dengan tepat satu catatan dalam database (catatan yang saya coba perbarui)
Yang aneh adalah bahwa saya memiliki pernyataan pembaruan yang sangat mirip di bagian kode yang berbeda dan menghasilkan SQL berikut ini dan memang memperbarui database SQL Server Compact Edition saya.
UPDATE [Sessions]
SET [Is_Active] = @p4, [Disconnected] = @p5
WHERE ([Session_RecId] = @p0) AND ([App_RecId] = @p1) AND ([Is_Active] = 1) AND ([Established] = @p2) AND ([Disconnected] IS NULL) AND ([Member_Id] IS NULL) AND ([Company_Id] IS NULL) AND ([Site] IS NULL) AND (NOT ([Is_Device] = 1)) AND ([Machine_Name] = @p3)
-- @p0: Input Guid (Size = 0; Prec = 0; Scale = 0) [0fbbee53-cf4c-4643-9045-e0a284ad131b]
-- @p1: Input Guid (Size = 0; Prec = 0; Scale = 0) [7a174954-dd18-406e-833d-8da650207d3d]
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:50 PM]
-- @p3: Input String (Size = 0; Prec = 0; Scale = 0) [CWMOBILEDEV]
-- @p4: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:52 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8
Saya telah mengkonfirmasi bahwa nilai bidang utama yang tepat telah diidentifikasi di Skema Database dan DBML yang menghasilkan kelas LINQ.
Saya kira ini hampir merupakan pertanyaan dua bagian:
- Mengapa pengecualian itu dilempar?
- Setelah meninjau set kedua dari SQL yang dihasilkan, sepertinya untuk mendeteksi konflik akan lebih baik untuk memeriksa semua bidang, tetapi saya membayangkan ini akan menjadi cukup tidak efisien. Apakah ini cara yang selalu berhasil? Apakah ada pengaturan untuk memeriksa kunci utama?
Saya telah berjuang dengan ini selama dua jam terakhir sehingga bantuan apa pun akan sangat kami hargai.