SQL Server Compact Edition에 대해 LINQ to SQL 연결을 사용하여 몇 가지 속성을 업데이트 한 후 DataContext에 대한 SubmitChanges를 실행할 때 "행을 찾을 수 없거나 변경되었습니다."라는 메시지가 표시됩니다. 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
데이터베이스 스키마와 LINQ 클래스를 생성하는 DBML 모두에서 적절한 기본 필드 값이 식별되었음을 확인했습니다.
나는 이것이 거의 두 부분으로 된 질문이라고 생각합니다.
- 예외가 발생하는 이유는 무엇입니까?
- 생성 된 SQL의 두 번째 세트를 검토 한 후 충돌을 감지하려면 모든 필드를 확인하는 것이 좋을 것 같지만 이것이 상당히 비효율적이라고 생각합니다. 이것이 항상 작동하는 방식입니까? 기본 키만 확인하는 설정이 있습니까?
나는 지난 두 시간 동안 이것으로 싸웠으므로 어떤 도움을 주시면 감사하겠습니다.