เมื่อดำเนินการ SubmitChanges ไปยัง DataContext หลังจากอัปเดตคุณสมบัติสองสามอย่างด้วยการเชื่อมต่อ LINQ กับ SQL (เทียบกับ SQL Server Compact Edition) ฉันได้รับข้อความ "ไม่พบแถวหรือเปลี่ยนแปลง" 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();
แบบสอบถามสร้าง SQL ต่อไปนี้:
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
ปัญหาที่ชัดเจนคือWHERE 0 = 1หลังจากโหลดบันทึกแล้วฉันได้ยืนยันว่าคุณสมบัติทั้งหมดใน "deviceSessionRecord" ถูกต้องในการรวมคีย์หลัก นอกจากนี้เมื่อจับ "ChangeConflictException" จะไม่มีข้อมูลเพิ่มเติมว่าเหตุใดจึงล้มเหลว ฉันยังยืนยันว่าข้อยกเว้นนี้เกิดขึ้นพร้อมกับระเบียนเดียวในฐานข้อมูล (บันทึกที่ฉันพยายามอัปเดต)
สิ่งที่แปลกคือฉันมีคำสั่งการอัปเดตที่คล้ายกันมากในส่วนอื่นของโค้ดและสร้าง SQL ต่อไปนี้และทำการอัปเดตฐานข้อมูล SQL Server Compact Edition ของฉัน
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
ฉันยืนยันว่ามีการระบุค่าฟิลด์หลักที่เหมาะสมทั้งในสคีมาฐานข้อมูลและ DBML ที่สร้างคลาส LINQ
ฉันเดาว่านี่เป็นคำถามสองส่วน:
- เหตุใดจึงมีการโยนข้อยกเว้น
- หลังจากตรวจสอบชุดที่สองของ SQL ที่สร้างขึ้นดูเหมือนว่าสำหรับการตรวจจับความขัดแย้งจะเป็นการดีที่จะตรวจสอบฟิลด์ทั้งหมด แต่ฉันคิดว่านี่จะไม่มีประสิทธิภาพพอสมควร วิธีนี้ใช้ได้ผลเสมอหรือไม่? มีการตั้งค่าเพียงตรวจสอบคีย์หลักหรือไม่
ฉันต่อสู้กับเรื่องนี้มาสองชั่วโมงแล้วดังนั้นความช่วยเหลือใด ๆ จะได้รับการชื่นชม