Podczas wykonywania funkcji SubmitChanges w DataContext po zaktualizowaniu kilku właściwości z połączeniem LINQ to SQL (w przypadku programu SQL Server Compact Edition) otrzymuję komunikat „Wiersz nie został znaleziony lub zmieniony”. 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();
Zapytanie generuje następujący kod 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
Oczywistym problemem jest gdzie 0 = 1. Po załadowaniu rekordu potwierdziłem, że wszystkie właściwości w „deviceSessionRecord” są poprawne i obejmują klucz podstawowy. Również podczas przechwytywania „ChangeConflictException” nie ma żadnych dodatkowych informacji o tym, dlaczego to się nie powiodło. Potwierdziłem również, że ten wyjątek jest generowany z dokładnie jednym rekordem w bazie danych (rekord, który próbuję zaktualizować)
Dziwne jest to, że mam bardzo podobną instrukcję aktualizacji w innej sekcji kodu i generuje ona następujący kod SQL i faktycznie aktualizuje moją bazę danych 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
Potwierdziłem, że odpowiednie wartości pól podstawowych zostały zidentyfikowane zarówno w schemacie bazy danych, jak iw DBML, który generuje klasy LINQ.
Myślę, że to prawie dwuczęściowe pytanie:
- Dlaczego wyjątek jest zgłaszany?
- Po przejrzeniu drugiego zestawu wygenerowanego kodu SQL wydaje się, że do wykrywania konfliktów dobrze byłoby sprawdzić wszystkie pola, ale wyobrażam sobie, że byłoby to dość nieefektywne. Czy tak to zawsze działa? Czy istnieje ustawienie, aby po prostu sprawdzić klucz podstawowy?
Walczyłem z tym przez ostatnie dwie godziny, więc każda pomoc byłaby mile widziana.