Beim Ausführen von SubmitChanges an den DataContext nach dem Aktualisieren einiger Eigenschaften mit einer LINQ-zu-SQL-Verbindung (gegen SQL Server Compact Edition) wird die Meldung "Zeile nicht gefunden oder geändert" angezeigt. 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();
Die Abfrage generiert die folgende 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
Das offensichtliche Problem ist WHERE 0 = 1. Nachdem der Datensatz geladen wurde, habe ich bestätigt, dass alle Eigenschaften im "deviceSessionRecord" korrekt sind, um den Primärschlüssel einzuschließen. Auch beim Abfangen der "ChangeConflictException" gibt es keine zusätzlichen Informationen darüber, warum dies fehlgeschlagen ist. Ich habe auch bestätigt, dass diese Ausnahme mit genau einem Datensatz in der Datenbank ausgelöst wird (der Datensatz, den ich zu aktualisieren versuche).
Was seltsam ist, ist, dass ich eine sehr ähnliche Update-Anweisung in einem anderen Codeabschnitt habe und sie das folgende SQL generiert und tatsächlich meine SQL Server Compact Edition-Datenbank aktualisiert.
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
Ich habe bestätigt, dass die richtigen primären Feldwerte sowohl im Datenbankschema als auch in der DBML identifiziert wurden, die die LINQ-Klassen generiert.
Ich denke, das ist fast eine zweiteilige Frage:
- Warum wird die Ausnahme ausgelöst?
- Nach der Überprüfung des zweiten Satzes von generiertem SQL scheint es für die Erkennung von Konflikten schön zu sein, alle Felder zu überprüfen, aber ich stelle mir vor, dass dies ziemlich ineffizient wäre. Funktioniert das immer so? Gibt es eine Einstellung, um nur den Primärschlüssel zu überprüfen?
Ich habe in den letzten zwei Stunden damit gekämpft, daher wäre jede Hilfe dankbar.