Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

La conversion d'un type de données datetime2 en un type de données smalldatetime a entraîné une valeur hors plage.\r\nL'instruction a été terminée

D'après l'apparence de l'erreur, votre base de données utilise SmallDateTime comme type de date. Sa valeur minimale est 1900-Jan-01. En supposant que votre entité est quelque chose comme ci-dessous

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

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

Votre valeur GameTime n'est pas nullable, donc lorsque vous ne lui définissez aucune valeur, ce sera toujours le DateTime.Min qui est 0000-Jan-01. C'est hors de la plage de SmallDateTime, mais c'est dans la plage de DateTime2. Ainsi, EF essaiera de transmettre un type SQL DateTime2 au serveur SQL. Étant donné que votre base de données utilise SmallDateTime, vous obtiendrez l'erreur indiquée dans votre question.

Pour résoudre le problème, vous disposez des options suivantes auxquelles je peux penser :

  • rendre le champ nullalbe. (vous devez toujours vérifier si vos dates d'entrée se situent dans la plage SmallDateTime.)

  • ou changer le type de date en DateTime2 dans le serveur SQL

  • ou forcez EF à utiliser le type de données DateTime2 lors de la création de la base de données. Le code ressemblera à quelque chose ci-dessous. (Cette méthode doit être à l'intérieur de votre classe de contexte.)


  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(t => t.GameTime )
            .HasColumnType("datetime2");
    }
  • Écrivez un assistant de conversion pour définir la valeur min de votre propriété DateTime pour qu'elle corresponde à smalldatetime dans votre application.

  • Écrivez un déclencheur dans la base de données pour convertir DateTime2 (à partir de la fin de l'application, mais datetime2 à la fin de la base de données) en smalldatetime.

J'espère que j'ai bien compris votre question et que ma réponse vous aidera.