Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

La conversione di un tipo di dati datetime2 in un tipo di dati smalldatetime ha prodotto un valore fuori intervallo.\r\nL'istruzione è stata terminata

Dall'aspetto dell'errore, il database utilizza SmallDateTime come tipo di data. Il suo valore minimo è 1900-gennaio-01. Supponendo che la tua entità sia qualcosa come di seguito

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

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

Il tuo valore GameTime non è nullable, quindi quando non imposti alcun valore per esso, sarà sempre DateTime.Min che è 0000-Jan-01. Questo è fuori dall'intervallo di SmallDateTime, ma è nell'intervallo di DateTime2. Quindi EF proverà a passare un tipo SQL DateTime2 al server SQL. Poiché il tuo database utilizza SmallDateTime, riceverai l'errore mostrato nella tua domanda.

Per risolvere il problema, hai le seguenti opzioni che mi vengono in mente:

  • rendere il campo nullalbe. (devi sempre controllare se le date di input rientrano nell'intervallo SmallDateTime.)

  • oppure modifica il tipo di data in DateTime2 nel server SQL

  • o forzare EF a usare il tipo di dati DateTime2 durante la creazione del database. Il codice sarà come qualcosa di seguito. (Questo metodo dovrebbe essere all'interno della tua classe di contesto.)


  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(t => t.GameTime )
            .HasColumnType("datetime2");
    }
  • Scrivi un convertitore helper per impostare il valore minimo della tua proprietà DateTime in modo che corrisponda a smalldatetime nella tua applicazione.

  • Scrivi un trigger nel database per convertire DateTime2 (dalla fine dell'applicazione, ma datetime2 alla fine del database) in smalldatetime.

Spero di aver compreso correttamente la tua domanda e la mia risposta aiuta.