Ao executar SubmitChanges para o DataContext após atualizar algumas propriedades com uma conexão LINQ to SQL (em relação ao SQL Server Compact Edition), obtenho uma "Linha não encontrada ou alterada." 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();
A consulta gera o seguinte 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
O problema óbvio é WHERE 0 = 1. Depois que o registro foi carregado, confirmei que todas as propriedades em "deviceSessionRecord" estão corretas para incluir a chave primária. Além disso, ao capturar a "ChangeConflictException", não há informações adicionais sobre o motivo da falha. Também confirmei que essa exceção é lançada com exatamente um registro no banco de dados (o registro que estou tentando atualizar)
O que é estranho é que eu tenho uma instrução de atualização muito semelhante em uma seção diferente do código e ela gera o seguinte SQL e de fato atualiza meu banco de dados 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
Confirmei que os valores de campos primários adequados foram identificados no esquema de banco de dados e no DBML que gera as classes LINQ.
Eu acho que esta é quase uma questão de duas partes:
- Por que a exceção está sendo lançada?
- Depois de revisar o segundo conjunto de SQL gerado, parece que para detectar conflitos seria bom verificar todos os campos, mas imagino que isso seja bastante ineficiente. É assim que sempre funciona? Existe uma configuração para apenas verificar a chave primária?
Tenho lutado contra isso nas últimas duas horas, então qualquer ajuda seria apreciada.