Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

A conversão de um tipo de dados datetime2 em um tipo de dados smalldatetime resultou em um valor fora do intervalo.\r\nA instrução foi encerrada


Pela aparência do erro, seu banco de dados está usando SmallDateTime como tipo de data. Seu valor mínimo é 1900-Jan-01. Supondo que sua entidade seja algo como abaixo
  public class Game
  {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid GameId { get; set; }

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

Seu valor GameTime não é anulável, então quando você não definir nenhum valor para ele, sempre será o DateTime.Min que é 0000-Jan-01. Isso está fora do intervalo de SmallDateTime, mas está no intervalo de DateTime2. Portanto, o EF tentará passar um tipo SQL DateTime2 para o servidor SQL. Como seu banco de dados está usando SmallDateTime, você receberá o erro mostrado em sua pergunta.

Para resolver o problema, você tem as seguintes opções que posso pensar:

  • tornar o campo nullalbe. (você sempre deve verificar se as datas de entrada estão dentro do intervalo SmallDateTime.)

  • ou altere o tipo de data para DateTime2 no servidor SQL

  • ou force o EF a usar o tipo de dados DateTime2 ao criar o banco de dados. O código ficará como algo abaixo. (Este método deve estar dentro de sua classe de contexto.)

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(t => t.GameTime )
            .HasColumnType("datetime2");
    }

  • Escreva um auxiliar de conversor para definir o valor mínimo da propriedade DateTime para corresponder a smalldatetime em seu aplicativo.

  • Escreva um gatilho no banco de dados para converter DateTime2 (do final do aplicativo, mas datetime2 no final do banco de dados) para smalldatetime.

Espero ter entendido sua pergunta corretamente, e minha resposta ajuda.