Quando si esegue SubmitChanges in DataContext dopo l'aggiornamento di un paio di proprietà con una connessione LINQ to SQL (rispetto a SQL Server Compact Edition) viene visualizzato il messaggio "Riga non trovata o modificata". 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();
La query genera il seguente 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
Il problema ovvio è WHERE 0 = 1 , dopo che il record è stato caricato, ho confermato che tutte le proprietà in "deviceSessionRecord" sono corrette per includere la chiave primaria. Inoltre, quando si rileva "ChangeConflictException" non sono disponibili ulteriori informazioni sul motivo per cui ciò non è riuscito. Ho anche confermato che questa eccezione viene generata con esattamente un record nel database (il record che sto tentando di aggiornare)
La cosa strana è che ho un'istruzione di aggiornamento molto simile in una diversa sezione di codice e genera il seguente SQL e aggiorna effettivamente il mio database di 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
Ho confermato che i valori corretti dei campi primari sono stati identificati sia nello schema del database che nel DBML che genera le classi LINQ.
Immagino che questa sia quasi una domanda in due parti:
- Perché viene generata l'eccezione?
- Dopo aver esaminato il secondo set di SQL generato, sembra che per rilevare i conflitti sarebbe bello controllare tutti i campi, ma immagino che questo sarebbe abbastanza inefficiente. È così che funziona sempre? Esiste un'impostazione per controllare solo la chiave primaria?
Ho combattuto con questo nelle ultime due ore, quindi qualsiasi aiuto sarebbe apprezzato.