Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Die Konvertierung eines datetime2-Datentyps in einen smalldatetime-Datentyp führte zu einem Wert außerhalb des zulässigen Bereichs.\r\nDie Anweisung wurde beendet

So wie der Fehler aussieht, verwendet Ihre Datenbank SmallDateTime als Datumstyp. Sein Mindestwert ist 1900-Jan-01. Angenommen, Ihre Entität ist so etwas wie unten

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

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

Ihr GameTime-Wert kann nicht auf Null gesetzt werden. Wenn Sie also keinen Wert dafür festlegen, ist es immer DateTime.Min, also 0000-Jan-01. Dies liegt außerhalb des Bereichs von SmallDateTime, aber im Bereich von DateTime2. Daher versucht EF, einen DateTime2-SQL-Typ an den SQL-Server zu übergeben. Da Ihre Datenbank SmallDateTime verwendet, erhalten Sie den in Ihrer Frage gezeigten Fehler.

Um das Problem zu lösen, haben Sie folgende Optionen, die mir einfallen:

  • Machen Sie das Feld nullalbe. (Sie müssen immer prüfen, ob Ihre Eingabedaten innerhalb des SmallDateTime-Bereichs liegen.)

  • oder ändern Sie den Datumstyp in DateTime2 in SQL Server

  • oder zwingen Sie EF, den DateTime2-Datentyp beim Erstellen der Datenbank zu verwenden. Der Code wird wie unten aussehen. (Diese Methode sollte innerhalb Ihrer Kontextklasse sein.)


  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(t => t.GameTime )
            .HasColumnType("datetime2");
    }
  • Schreiben Sie einen Hilfskonverter, um den Mindestwert Ihrer DateTime-Eigenschaft so einzustellen, dass er in Ihrer Anwendung mit smalldatetime übereinstimmt.

  • Schreiben Sie einen Trigger in die Datenbank, um DateTime2 (vom Anwendungsende, aber datetime2 am Datenbankende) in smalldatetime umzuwandeln.

Hoffentlich habe ich Ihre Frage richtig verstanden und meine Antwort hilft weiter.