Eu tenho o seguinte código no meu HomeController:
public ActionResult Edit(int id)
{
var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First();
return View(ArticleToEdit);
}
[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Article ArticleToEdit)
{
var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First();
if (!ModelState.IsValid)
return View(originalArticle);
_db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit);
_db.SaveChanges();
return RedirectToAction("Index");
}
E esta é a visão para o método Edit:
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="headline">Headline</label>
<%= Html.TextBox("headline") %>
</p>
<p>
<label for="story">Story <span>( HTML Allowed )</span></label>
<%= Html.TextArea("story") %>
</p>
<p>
<label for="image">Image URL</label>
<%= Html.TextBox("image") %>
</p>
<p>
<input type="submit" value="Post" />
</p>
</fieldset>
<% } %>
Quando clico no botão Enviar, recebo o erro: {"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."}
Alguma idéia de qual é o problema? Estou assumindo que o método de edição está tentando atualizar o valor postado no banco de dados para o editado, mas por algum motivo não está gostando ... Embora eu não veja por que a data está envolvida, pois não é mencionada no método de controlador para edição?
asp.net-mvc
Cameron
fonte
fonte
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2");
Respostas:
O problema é que você está usando
ApplyPropertyChanges
um objeto de modelo que só foi preenchido com dados no formulário (título, matéria e imagem).ApplyPropertyChanges
aplica alterações a todas as propriedades do objeto, incluindo o não inicializadoDateTime
, definido como 0001-01-01, que está fora do intervalo do SQL ServerDATETIME
.Em vez de usar
ApplyPropertyChanges
, sugiro recuperar o objeto que está sendo modificado, alterar os campos específicos que seu formulário edita e salvar o objeto com essas modificações; Dessa forma, apenas os campos alterados são modificados. Como alternativa, você pode colocar entradas ocultas na sua página com os outros campos preenchidos, mas isso não seria muito amigável com as edições simultâneas.Atualizar:
Aqui está um exemplo não testado de apenas atualizando alguns campos do seu objeto (assumindo que você esteja usando o LINQ to SQL):
fonte
modifiedDate
é o nome de sua propriedade)story.modifiedDate = DateTime.Now;
bit ao meu código atual? GraçasEsse é um erro comum que as pessoas enfrentam ao usar o Entity Framework. Isso ocorre quando a entidade associada à tabela que está sendo salva possui um campo de data e hora obrigatório e você não a define com algum valor.
O objeto de data e hora padrão é criado com um valor de
01/01/1000
e será usado no lugar de null. Isso será enviado para a coluna datetime, que pode conter valores de data de1753-01-01 00:00:00
diante, mas não antes, levando à exceção fora do intervalo.Este erro pode ser resolvido modificando o campo do banco de dados para aceitar nulo ou inicializando o campo com um valor.
fonte
Msdn
Resposta: Suponho que você tente salvar
DateTime
com o valor '0001/1/1'. Basta definir o ponto de interrupção e depurá-lo; se houver, substituaDateTime
pornull
ou defina a data normal.fonte
Este estava me deixando louco. Eu queria evitar o uso de uma data e hora anulável (
DateTime?
). Também não tive a opção de usar o tipo datetime2 do SQL 2008 (modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");
).Acabei optando pelo seguinte:
fonte
Você também pode corrigir esse problema adicionando ao modelo (versão do Entity Framework> = 5)
fonte
Se você possui uma coluna datetime e permite null, você receberá esse erro. Eu recomendo definir um valor para passar para o objeto antes de .SaveChanges ();
fonte
Eu recebi esse erro depois de alterar meu modelo (primeiro o código) da seguinte maneira:
para
As linhas presentes com valor nulo em DateCreated causaram esse erro. Então, eu tive que usar a instrução SQL UPDATE manualmente para inicializar o campo com um valor padrão.
Outra solução poderia ser uma especificação do valor padrão para o arquivado.
fonte
No meu caso, no inicializador da classe que eu estava usando na tabela do banco de dados, não estava definindo nenhum valor padrão para minha propriedade DateTime, resultando no problema explicado na resposta de @Andrew Orsich. Então, acabei de tornar a propriedade anulável. Ou eu também poderia ter dado o DateTime.Now no construtor. Espero que ajude alguém.
fonte
Parece que você está usando uma estrutura de entidade. Minha solução foi alternar todas as colunas datetime para datetime2 e usar datetime2 para novas colunas; em outras palavras, fazer com que o EF use datetime2 por padrão. Adicione isso ao método OnModelCreating no seu contexto:
Isso receberá todos os DateTime e DateTime? propriedades em todas as entidades em seu modelo.
fonte
Eu tive o mesmo problema, infelizmente, tenho duas propriedades DateTime no meu modelo e uma propriedade DateTime é nula antes de salvar SaveChanges.
Portanto, verifique se o modelo possui o valor DateTime antes de salvar as alterações ou anulá-lo para evitar erros:
Portanto, isso resolve meu problema, é uma questão de garantir que a data do modelo esteja correta antes de persistir no banco de dados:
fonte
Se você estiver usando o Entity Framework versão> = 5, aplicando a anotação [DatabaseGenerated (DatabaseGeneratedOption.Computed)] às propriedades DateTime da sua classe permitirá que o gatilho da tabela do banco de dados faça seu trabalho de inserir datas para criação e atualização de registros sem causar seu código do Entity Framework para amordaçar.
É semelhante à 6ª resposta, escrita por Dongolo Jeno e editada por Gille Q.
fonte
Além disso, se você não conhece parte do código onde ocorreu o erro, pode criar um perfil de execução "ruim" do sql usando o sql profiler integrado ao mssql.
O parâmetro datetime incorreto exibirá algo assim:
fonte
Esse problema geralmente ocorre quando você está tentando atualizar uma entidade. Por exemplo, você tem uma entidade que contém um campo chamado
DateCreated
que é [Obrigatório] e quando você inserção de registro, nenhum erro será retornado, mas quando você deseja atualizar essa entidade particular, você a obter oAgora, aqui está a solução:
Na sua visualização de edição, ou seja,
edit.cshtml
para usuários do MVC, tudo o que você precisa fazer é adicionar um campo de formulário oculto para o seuDateCreated
logo abaixo do campo oculto, para a chave primária dos dados de edição.Exemplo:
Adicionando isso à sua visualização de edição, você nunca terá esse erro, garanto.
fonte
Você precisa habilitar o valor nulo para sua variável de data:
fonte
Tente tornar sua propriedade anulável.
Trabalhou para mim.
fonte
Se você tiver acesso ao banco de dados, poderá alterar o tipo de coluna do banco de dados para datetime para datetime2 (7). Ele ainda enviará um objeto datetime e será salvo.
fonte
O modelo deve ter data / hora anulável. O método sugerido anteriormente para recuperar o objeto que precisa ser modificado deve ser usado em vez de ApplyPropertyChanges. No meu caso, eu tinha esse método para salvar meu objeto:
E, em serviço, recupero usando:
O código de serviço completo é o seguinte:
fonte
[Resolvido] No Entity Framework Code Primeiro (meu caso) apenas mudando
DateTime
paraDateTime?
resolver o meu problema.fonte
Erro: a conversão de um tipo de dados datetime2 para um tipo de dados datetime resultou em um valor fora do intervalo.
Este erro ocorreu quando devido a NÃO atribuir qualquer valor a uma coluna de data NOT NULL no SQL DB usando EF e foi resolvido atribuindo o mesmo.
Espero que isto ajude!
fonte
Tenho esse problema quando criei minhas classes da abordagem Database First. Resolvido usando simplesmente Convert.DateTime (dateCausingProblem) Na verdade, sempre tente converter valores antes de passar, ele evita valores inesperados.
fonte
você deve corresponder o formato de entrada do seu campo de data ao formato de entidade necessário, que é aaaa / mm / dd
fonte