Estoy usando las API DbContext y Code First introducidas con Entity Framework 4.1.
El modelo de datos utiliza tipos de datos básicos como string
y DateTime
. La única anotación de datos que estoy usando en algunos casos es [Required]
, pero eso no está en ninguna de las DateTime
propiedades. Ejemplo:
public virtual DateTime Start { get; set; }
La subclase DbContext también es simple y se ve así:
public class EventsContext : DbContext
{
public DbSet<Event> Events { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Event>().ToTable("Events");
}
}
El inicializador establece las fechas en el modelo a valores razonables en este año o el próximo.
Sin embargo, cuando ejecuto el inicializador, aparece este error en context.SaveChanges()
:
La conversión de un tipo de datos datetime2 a un tipo de datos datetime dio como resultado un valor fuera de rango. La instrucción se ha terminado.
No entiendo por qué sucede esto en absoluto porque todo es muy simple. Tampoco estoy seguro de cómo solucionarlo ya que no hay un archivo edmx para editar.
¿Algunas ideas?
fuente
Respuestas:
Debe asegurarse de que Start sea mayor o igual que SqlDateTime.MinValue (1 de enero de 1753); de manera predeterminada, Start es igual a DateTime.MinValue (1 de enero de 0001).
fuente
Sencillo. Primero en su código, establezca el tipo de DateTime en DateTime ?. Para que pueda trabajar con el tipo DateTime anulable en la base de datos. Ejemplo de entidad:
fuente
En algunos casos,
DateTime.MinValue
(o equivalentemente,default(DateTime)
) se usa para indicar un valor desconocido.Este método de extensión simple puede ayudar a manejar tales situaciones:
Uso:
fuente
Puede hacer que el campo sea anulable, si eso se adapta a sus preocupaciones específicas de modelado. Una fecha nula no se convertirá en una fecha que no se encuentre dentro del rango del tipo DateTime de SQL como lo haría un valor predeterminado. Otra opción es asignar explícitamente a un tipo diferente, tal vez con,
fuente
Aunque esta pregunta es bastante antigua y ya hay excelentes respuestas, pensé que debería poner una más que explica 3 enfoques diferentes para resolver este problema.
1er enfoque
Asigna explícitamente la
DateTime
propiedadpublic virtual DateTime Start { get; set; }
adatetime2
en la columna correspondiente de la tabla. Porque por defecto EF lo asignará adatetime
.Esto se puede hacer mediante una fluida API o anotación de datos.
API fluida
En DbContext, la clase anula
OnModelCreating
y configura la propiedadStart
(por razones explicativas, es una propiedad de la clase EntityClass).Anotación de datos
2º enfoque
Inicialice
Start
a un valor predeterminado en EntityClass constructor. Esto es bueno como si por alguna razón el valor deStart
no se establece antes de guardar la entidad en el inicio de la base de datos siempre tendrá un valor predeterminado. Asegúrese de que el valor predeterminado sea mayor o igual que SqlDateTime.MinValue (del 1 de enero de 1753 al 31 de diciembre de 9999)3er enfoque
Hacer
Start
que sea de tipo nullableDateTime
-note?
afterDateTime
-Para más explicaciones lea esta publicación
fuente
Si sus
DateTime
propiedades son anulables en la base de datos, asegúrese de usarlasDateTime?
para las propiedades de objeto asociadas o EF pasaráDateTime.MinValue
por valores no asignados que están fuera del rango de lo que puede manejar el tipo de fecha y hora de SQL.fuente
Mi solución fue cambiar todas las columnas de fecha y hora a datetime2, y usar datetime2 para cualquier columna nueva. En otras palabras, EF usa datetime2 por defecto. Agregue esto al método OnModelCreating en su contexto:
Que obtendrá todo el DateTime y DateTime? propiedades en todas sus entidades.
fuente
inicializar la propiedad Start en el constructor
Esto funcionó para mí cuando intentaba agregar algunos campos nuevos a la tabla de usuarios de ASP .Net Identity Framework (AspNetUsers) usando Code First. Actualicé el Class - ApplicationUser en IdentityModels.cs y agregué un campo lastLogin de tipo DateTime.
fuente
Según la respuesta del usuario @ andygjp, es mejor si anula la base
Db.SaveChanges()
método y agrega una función para anular cualquier fecha que no se encuentre entre SqlDateTime.MinValue y SqlDateTime.MaxValue.Aquí está el código de ejemplo
Tomado del comentario del usuario @ sky-dev en https://stackoverflow.com/a/11297294/9158120
fuente
Tuve el mismo problema y en mi caso estaba configurando la fecha a la nueva DateTime () en lugar de DateTime.
fuente
En mi caso, esto sucedió cuando utilicé la entidad y la tabla sql tiene el valor predeterminado de datetime == getdate (). Entonces, ¿qué hice para establecer un valor para este campo?
fuente
Estoy usando Database First y cuando me ocurrió este error, mi solución fue forzar ProviderManifestToken = "2005" en el archivo edmx (haciendo que los modelos sean compatibles con SQL Server 2005). No sé si algo similar es posible para Code First.
fuente
Una línea arregla esto:
Entonces, en mi código, agregué:
Agregar esa línea a la subclase DBContext anula la sección vacía OnModelCreating debería funcionar.
fuente
En mi caso, después de algunas refactorizaciones en EF6, mis pruebas fallaban con el mismo mensaje de error que el póster original, pero mi solución no tenía nada que ver con los campos DateTime.
Solo me faltaba un campo obligatorio al crear la entidad. Una vez que agregué el campo faltante, el error desapareció. ¿Mi entidad tiene dos DateTime? campos pero no eran el problema.
fuente