questão LINQ to SQL com data e hora?
-
06-07-2019 - |
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();
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.