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

Konverteringen af ​​en datetime2-datatype til en smalldatetime-datatype resulterede i en værdi uden for området.\r\nSætningen er blevet afsluttet

Ud fra fejlens udseende bruger din database SmallDateTime som datotype. Dens minimumværdi er 1900-jan-01. Forudsat at din enhed er noget som nedenfor

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

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

Din GameTime-værdi er ikke nullbar, så når du ikke angiver nogen værdi for den, vil det altid være DateTime.Min, som er 0000-Jan-01. Dette er uden for rækkevidde af SmallDateTime, men det er inden for rækkevidde af DateTime2. Så EF vil forsøge at sende en DateTime2 SQL-type til SQL-serveren. Fordi din database bruger SmallDateTime, vil du få fejlen vist i dit spørgsmål.

For at løse problemet har du følgende muligheder, som jeg kan komme i tanke om:

  • gøre feltet nullalbe. (du skal altid kontrollere, om dine inputdatoer er inden for SmallDateTime-intervallet.)

  • eller skift datotypen til DateTime2 i SQL-serveren

  • eller tving EF til at bruge DateTime2-datatypen ved oprettelse af database. Koden vil være som noget nedenfor. (Denne metode skal være inde i din kontekstklasse.)


  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(t => t.GameTime )
            .HasColumnType("datetime2");
    }
  • Skriv en konverterhjælper for at indstille min værdi for din DateTime-egenskab, så den matcher smalldatetime i din applikation.

  • Skriv en trigger i databasen for at konvertere DateTime2 (fra programslut, men datetime2 i databaseslut) til smalldatetime.

Forhåbentlig har jeg forstået dit spørgsmål korrekt, og mit svar hjælper.




  1. Er der nogen hash-funktion i PostgreSQL?

  2. MYSQL, Max, Group by og Max

  3. MySQL:Antal poster med på hinanden følgende måneder

  4. PDO DBLIB med adgang til SQL Server 2008 og 2012