Lors de l'exécution de SubmitChanges vers DataContext après la mise à jour de quelques propriétés avec une connexion LINQ to SQL (par rapport à SQL Server Compact Edition), j'obtiens un message «Ligne introuvable ou modifiée». 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 requête génère le SQL suivant:
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
Le problème évident est le WHERE 0 = 1 , après le chargement de l'enregistrement, j'ai confirmé que toutes les propriétés du "deviceSessionRecord" sont correctes pour inclure la clé primaire. Aussi lors de la capture de "ChangeConflictException", il n'y a aucune information supplémentaire sur la raison pour laquelle cela a échoué. J'ai également confirmé que cette exception est levée avec exactement un enregistrement dans la base de données (l'enregistrement que je tente de mettre à jour)
Ce qui est étrange, c'est que j'ai une instruction de mise à jour très similaire dans une section de code différente et qu'elle génère le SQL suivant et met effectivement à jour ma base de données 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
J'ai confirmé que les valeurs de champs primaires appropriées ont été identifiées à la fois dans le schéma de base de données et dans le DBML qui génère les classes LINQ.
Je suppose que c'est presque une question en deux parties:
- Pourquoi l'exception est-elle levée?
- Après avoir examiné le deuxième ensemble de SQL généré, il semble que pour détecter les conflits, il serait bien de vérifier tous les champs, mais j'imagine que ce serait assez inefficace. Est-ce ainsi que cela fonctionne toujours? Existe-t-il un paramètre pour vérifier simplement la clé primaire?
Je me bats avec ça depuis deux heures, donc toute aide serait appréciée.