sql >> Databasteknik >  >> RDS >> Sqlserver

Konverteringen av en datetime2-datatyp till en smalldatetime-datatyp resulterade i ett värde utanför intervallet.\r\nSatsen har avslutats

Från utseendet på felet använder din databas SmallDateTime som datumtyp. Dess lägsta värde är 1900-jan-01. Förutsatt att din enhet är ungefär som nedan

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

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

Ditt GameTime-värde är inte nullbart, så när du inte anger något värde för det kommer det alltid att vara DateTime.Min som är 0000-Jan-01. Detta är utanför intervallet för SmallDateTime, men det är inom intervallet DateTime2. Så EF kommer att försöka skicka en DateTime2 SQL-typ till SQL-servern. Eftersom din databas använder SmallDateTime får du felet som visas i din fråga.

För att lösa problemet har du följande alternativ som jag kan tänka mig:

  • göra fältet nullalbe. (du måste alltid kontrollera om dina inmatningsdatum ligger inom SmallDateTime-intervallet.)

  • eller ändra datumtypen till DateTime2 i SQL-servern

  • eller tvinga EF att använda datatypen DateTime2 när databasen skapas. Koden kommer att vara som något nedan. (Denna metod bör vara inuti din kontextklass.)


  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(t => t.GameTime )
            .HasColumnType("datetime2");
    }
  • Skriv en omvandlingshjälp för att ställa in min-värdet för din DateTime-egenskap så att den matchar smalldatetime i din applikation.

  • Skriv en trigger i databasen för att konvertera DateTime2 (från applikationsslutet, men datetime2 i databasens slut) till smalldatetime.

Förhoppningsvis har jag förstått din fråga ordentligt, och mitt svar hjälper.




  1. mysql count prestanda

  2. Problem med att ladda upp data till databasen

  3. Läs XML-dokument lagrat i SQL Server med textdatatyp?

  4. Förstå cast från bytea till oid