Pergunta

Ok, estou usando o SQL Server Express 2008 e .Net 3.5 (c #)

Eu tenho um par de data e hora campos no banco de dados e estou tentando fazer uma edição para uma linha (usando LINQ to SQL) eu recebo o erro "Linha não encontrado ou alterado."

Eu passei algum tempo recebendo o SQL gerado e parece que o problema é causado pelos milissegundos ligados à data e hora.

SQL gerado que não funciona,

 @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [20/10/2009 16:04:45]
 @p6: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 10:15:36]
 @p7: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 09:27:27]

AND ([SignUpDate] = @p5) 
AND ([LastActivityDate] = @p6) 
AND ([LastLoginDate] = @p7) 

se eu modificá-lo eu mesmo como assim que funciona,

 @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [20/10/2009 16:04:45.390]
 @p6: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 10:15:36.733]
 @p7: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 09:27:27.747]

AND ([SignUpDate] = @p5) 
AND ([LastActivityDate] = @p6) 
AND ([LastLoginDate] = @p7) 

Quais são as minhas opções em maneiras de obter espalhados isso?

Apenas para adicionar este é o meu código editar

var UserToEdit = this.GetUser(UserId);

UserToEdit.Forename = Fields["Forename"];
UserToEdit.Surname = Fields["Surname"];
UserToEdit.DateOfBirth = Convert.ToDateTime(Fields["DateOfBirth"]);
UserToEdit.DisplayName = Fields["DisplayName"];
UserToEdit.TelephoneNumber = Fields["TelephoneNumber"];

_db.SubmitChanges();
Foi útil?

Solução

Veja este link,

System.Data.Linq.ChangeConflictException: Linha não encontrada ou alterados

# High precision datetime fields are used. The solution is to set

UpdateCheck nunca para essa coluna seu arquivo DBML

Isso tem resolvido o meu problema, mas sinto um pouco como um hack.

Eu estou deixando esta aberta para ver o que os outros pensam.

Outras dicas

Verifique este post , Ele explica que precisamos manter um olho em DateTime colunas, cheque para diferentes tipos de dados entre o dbml e seu banco de dados, e, por último, explica a abordagem de simultaneidade otimista LinQ.

where foo.SignupDate >= signUpDate
  && foo.SignUpDate < signUpDate.AddSeconds(1)
  && foo.LastActivityDate >= lastActivityDate 
  && foo.LastActivityDate < lastActivityDate.AddSeconds(1)
  && foo.LastLoginDate >= lastActivityDate 
  && foo.LastLoginDate < lastActivityDate.AddSeconds(1)

Uma vez que a única diferença no seu exemplo é milissegundos, então eu iria usar SQL Profiler para determinar se o SELECT milissegundos retorno original. Então veja se você pode corrigir esse problema. Parece que os dados linha contém milissegundos, mas a sua escolha não é devolvê-los.

Depois de fazer isso e você ainda tem a questão, podemos ver que o próximo passo será.

Basicamente o esquema MSSQL e Contexto Linq de dados é não operam bem em conjunto na configuração mencionado. Você pode mudar de esquema DB ou Contexto de dados.

Alterar MSSQL tipo de dados

Estamos usando smalldatetime em vez de datetime quando um precisão de 1 minuto pode ser usado.

Alterar LINQ to SQL contexto de dados

Se você precisar de maior precisão de 1 minuto, olhada própria resposta do LiamB para definir UpdateCheck para Nunca para a coluna na o contexto de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top