Khi thực thi SubmitChanges cho DataContext sau khi cập nhật một số thuộc tính có kết nối LINQ to SQL (đối với SQL Server Compact Edition), tôi nhận được thông báo "Không tìm thấy hoặc đã thay đổi hàng". 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();
Truy vấn tạo ra SQL sau:
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
Vấn đề rõ ràng là WHERE 0 = 1 , Sau khi bản ghi được tải, tôi đã xác nhận rằng tất cả các thuộc tính trong "deviceSessionRecord" là chính xác để bao gồm khóa chính. Ngoài ra khi bắt "ChangeConflictException", không có thông tin bổ sung về lý do tại sao điều này không thành công. Tôi cũng đã xác nhận rằng ngoại lệ này được ném với chính xác một bản ghi trong cơ sở dữ liệu (bản ghi mà tôi đang cố gắng cập nhật)
Điều kỳ lạ là tôi có một câu lệnh cập nhật rất giống nhau trong một phần mã khác và nó tạo ra SQL sau và thực sự cập nhật cơ sở dữ liệu SQL Server Compact Edition của tôi.
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
Tôi đã xác nhận rằng các giá trị trường chính thích hợp đã được xác định trong cả Lược đồ cơ sở dữ liệu và DBML tạo ra các lớp LINQ.
Tôi đoán đây gần như là một câu hỏi gồm hai phần:
- Tại sao ngoại lệ được ném?
- Sau khi xem xét tập hợp thứ hai của SQL được tạo, có vẻ như để phát hiện xung đột, sẽ rất tốt nếu kiểm tra tất cả các trường, nhưng tôi tưởng tượng điều này sẽ khá kém hiệu quả. Đây có phải là cách này luôn luôn hoạt động? Có cài đặt nào để chỉ kiểm tra khóa chính không?
Tôi đã đấu tranh với điều này trong hai giờ qua nên mọi sự giúp đỡ sẽ được đánh giá cao.