sql >> Base de Datos >  >> RDS >> Sqlserver

La conversión de un tipo de datos datetime2 a un tipo de datos smalldatetime resultó en un valor fuera de rango.\r\nLa declaración ha sido terminada

Por el aspecto del error, su base de datos está utilizando SmallDateTime como tipo de fecha. Su valor mínimo es 1900-Ene-01. Suponiendo que su entidad es algo como a continuación

  public class Game
  {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid GameId { get; set; }

    [Required]
    public DateTime GameTime { get; set; }
  }

Su valor de GameTime no admite valores NULL, por lo que cuando no establece ningún valor para él, siempre será DateTime.Min, que es 0000-Jan-01. Esto está fuera del rango de SmallDateTime, pero está dentro del rango de DateTime2. Entonces, EF intentará pasar un tipo de SQL DateTime2 al servidor SQL. Debido a que su base de datos usa SmallDateTime, obtendrá el error que se muestra en su pregunta.

Para resolver el problema, tiene las siguientes opciones que se me ocurren:

  • hacer que el campo sea nulo. (siempre debe verificar si sus fechas de entrada están dentro del rango SmallDateTime).

  • o cambie el tipo de fecha a DateTime2 en el servidor SQL

  • o forzar a EF a usar el tipo de datos DateTime2 al crear la base de datos. El código será como algo a continuación. (Este método debería estar dentro de su clase de contexto).


  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(t => t.GameTime )
            .HasColumnType("datetime2");
    }
  • Escriba un asistente de conversión para establecer el valor mínimo de su propiedad DateTime para que coincida con smalldatetime en su aplicación.

  • Escriba un disparador en la base de datos para convertir DateTime2 (del final de la aplicación, pero datetime2 en el final de la base de datos) a smalldatetime.

Con suerte, he entendido tu pregunta correctamente y mi respuesta ayuda.