Tengo el siguiente código en mi 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");
}
Y esta es la vista del método Editar:
<% 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>
<% } %>
Cuando presiono el botón Enviar {"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."}
aparece el error: ¿ Alguna idea de cuál es el problema? Supongo que el método de edición está tratando de actualizar el valor publicado en el DB al editado, pero por alguna razón no le gusta ... Aunque no veo por qué está involucrada la fecha, ya que no se menciona en el método controlador para editar?
asp.net-mvc
Cameron
fuente
fuente
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2");
Respuestas:
El problema es que está utilizando
ApplyPropertyChanges
un objeto modelo que solo se ha completado con datos en el formulario (título, historia e imagen).ApplyPropertyChanges
aplica cambios a todas las propiedades del objeto, incluido el no inicializadoDateTime
, que se establece en 0001-01-01, que está fuera del rango de SQL ServerDATETIME
.En lugar de usar
ApplyPropertyChanges
, sugiero recuperar el objeto que se está modificando, cambiar los campos específicos que edita su formulario y luego guardar el objeto con esas modificaciones; de esa manera, solo se modifican los campos modificados. Alternativamente, puede colocar entradas ocultas en su página con los otros campos poblados, pero eso no sería muy amigable con las ediciones concurrentes.Actualizar:
Aquí hay una muestra no probada de solo actualizar algunos campos de su objeto (esto supone que está utilizando LINQ to SQL):
fuente
modifiedDate
es el nombre de su propiedad)story.modifiedDate = DateTime.Now;
bit a mi código actual? GraciasEste es un error común que enfrentan las personas cuando usan Entity Framework. Esto ocurre cuando la entidad asociada con la tabla que se está guardando tiene un campo de fecha y hora obligatorio y no lo establece con algún valor.
El objeto datetime predeterminado se crea con un valor de
01/01/1000
y se usará en lugar de nulo. Esto se enviará a la columna de fecha y hora que puede contener valores de fecha en1753-01-01 00:00:00
adelante, pero no antes, lo que lleva a la excepción de fuera de rango.Este error puede resolverse modificando el campo de la base de datos para aceptar nulo o inicializando el campo con un valor.
fuente
Msdn
Respuesta: Supongo que intenta guardar
DateTime
con el valor '0001/1/1'. Sólo hay que establecer punto de interrupción y depurarlo, si es así, sustituirDateTime
connull
o conjunto de fecha normal.fuente
Este me estaba volviendo loco. Quería evitar el uso de una fecha y hora anulables (
DateTime?
). Tampoco tenía la opción de usar el tipo datetime2 de SQL 2008 (modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");
).Finalmente opté por lo siguiente:
fuente
También puede solucionar este problema agregando al modelo (versión de Entity Framework> = 5)
fuente
Si tiene una columna que es datetime y permite nulo, obtendrá este error. Recomiendo establecer un valor para pasar al objeto antes .SaveChanges ();
fuente
Recibí este error después de cambiar mi modelo (código primero) de la siguiente manera:
a
Las filas actuales con valor nulo en DateCreated causaron este error. Así que tuve que usar la instrucción UPDATE de SQL manualmente para inicializar el campo con un valor estándar.
Otra solución podría ser especificar el valor predeterminado para el archivo.
fuente
En mi caso, en el inicializador de la clase que estaba usando en la tabla de la base de datos, no estaba configurando ningún valor predeterminado para mi propiedad DateTime, lo que resultó en el problema explicado en la respuesta de @Andrew Orsich. Así que acabo de anular la propiedad. O también podría haberle dado DateTime.Now en el constructor. Espero que ayude a alguien.
fuente
Parece que está utilizando el marco de la entidad. Mi solución fue cambiar todas las columnas de fecha y hora a datetime2, y usar datetime2 para cualquier columna nueva, en otras palabras, hacer que EF use datetime2 por defecto. Agregue esto al método OnModelCreating en su contexto:
Que obtendrá todo el DateTime y DateTime? propiedades en todas las entidades en su modelo.
fuente
Tuve el mismo problema, desafortunadamente, tengo dos propiedades DateTime en mi modelo y una propiedad DateTime es nula antes de hacer SaveChanges.
Por lo tanto, asegúrese de que su modelo tenga un valor de fecha y hora antes de guardar los cambios o que sea anulable para evitar errores:
Así que esto resuelve mi problema, es cuestión de asegurarse de que la fecha de su modelo sea correcta antes de persistir en la base de datos:
fuente
Si está utilizando Entity Framework versión> = 5, la aplicación de la anotación [DatabaseGeneratedOption.Computed]] a las propiedades DateTime de su clase permitirá que el desencadenador de la tabla de la base de datos haga su trabajo de ingresar fechas para la creación y actualización de registros sin causar su código de Entity Framework para amordazar.
Esto es similar a la sexta respuesta, escrita por Dongolo Jeno y editada por Gille Q.
fuente
Además, si no conoce parte del código en el que se produjo el error, puede perfilar la ejecución sql "incorrecta" utilizando el perfilador sql integrado en mssql.
El parámetro de fecha y hora incorrecto mostrará algo así:
fuente
Este problema generalmente ocurre cuando intenta actualizar una entidad. Por ejemplo, tiene una entidad que contiene un campo llamado
DateCreated
que es [Obligatorio] y cuando inserta el registro, no se devuelve ningún error, pero cuando desea actualizar esa entidad en particular, obtiene elAhora aquí está la solución:
En su vista de edición, es decir,
edit.cshtml
para los usuarios de MVC, todo lo que necesita hacer es agregar un campo de formulario ocultoDateCreated
justo debajo del campo oculto para la clave principal de los datos de edición.Ejemplo:
Agregando esto a su vista de edición, nunca tendrá ese error, se lo aseguro.
fuente
Debe habilitar el valor nulo para su variable de fecha:
fuente
Intente hacer que su propiedad sea anulable.
Trabajó para mi.
fuente
Si tiene acceso a la base de datos, puede cambiar el tipo de columna de la base de datos de fecha y hora a fecha y hora2 (7) todavía enviará un objeto de fecha y hora y se guardará
fuente
El modelo debe tener fecha y hora anulables. El método sugerido anteriormente para recuperar el objeto que debe modificarse debe usarse en lugar de ApplyPropertyChanges. En mi caso, tenía este método para guardar mi objeto:
Y luego en servicio, recupero usando:
El código completo del servicio es el siguiente:
fuente
[Resuelto] En Entity Framework Code First (mi caso) simplemente cambiando
DateTime
paraDateTime?
resolver mi problema.fuente
Error: la conversión de un tipo de datos datetime2 a un tipo de datos datetime dio como resultado un valor fuera de rango.
Este error ocurrió cuando debido a NO asignar ningún valor a una columna de fecha NO NULA en SQL DB usando EF y se resolvió asignando el mismo.
¡Espero que esto ayude!
fuente
Tengo este problema cuando creé mis clases desde el enfoque de Base de datos primero. Resuelto usando simplemente Convert.DateTime (dateCausingProblem) De hecho, siempre intente convertir los valores antes de pasar, lo salva de valores inesperados.
fuente
debe hacer coincidir el formato de entrada de su campo de fecha con el formato de entidad requerido que es aaaa / mm / dd
fuente