sql >> Databasteknik >  >> RDS >> Oracle

Oracle Entity Framework-leverantör lagrar inte DateTime.Now med millisekunder

A ha! Min fantastiska kollega fick en idé och den fungerade!

I vår EF-kod försökte vi sätta

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<EntityClass>().Property(p => p.TIMESTAMP).HasPrecision(6);
}

Och sedan DateTime.Now med millisekunder lagrades i databasen

Uppdatering – det är värt att nämna hur jag hamnade i den här situationen

Bygga databasen med Model First i en "test"-applikation

  1. Min app måste fungera med både SQL Server och Oracle. Så...
  2. Jag började med att designa min databas i ett EDMX-diagram
  3. När diagrammet var klart genererade jag DDL för SQL Server.
  4. Av någon anledning kunde Oracle EF-leverantören inte generera DDL så jag fortsatte att manuellt göra ändringar i SQL Server DDL så att det skulle vara korrekt syntaktisk

    Första problemet - min Oracle DDL använde ett datum istället för en tidsstämpel. Se till att du använder Timestamp!!! DateTime i Oracle lagrar inte millisekunder.

Använda kod först från databasen för den faktiska lösningen

  1. Jag ville att appen skulle använda metoden Code First (bara vad jag föredrar. Jag tror att det är lättare att underhålla)
  2. Så jag kopplade till SQL Server-databasen och genererade alla mina klasser från det schemat.
  3. Jag klarade alla mina enhetstester och bestämde mig sedan för att testa det med Oracle-databasen
  4. Även efter att jag bytte från DATE till Timestamp hade jag fortfarande problem med att millisekunderna gick in.
  5. Jag genererade en annan Code First-modell i en testlösning för visuell studio med en TIMESTAMP(6) skriv i Oracle, förutom när jag tittade på OnModelCreating kod genererade den inget med HasPrecision(6) Det fanns inte heller några dekoratörer på fastigheten i den genererade C# POCO-klassen.
  6. Jag har märkt om du har HasPrecision(6) kod i din OnModelCreating , Code FirstCreateDatabase() kommer faktiskt att göra en Oracle TIMESTAMP(6) . Om du inte gör det kommer Oracle EF-leverantören att använda DATE

Jag tror att om du använder Model First-metoden kan du ställa in precisionsvärden i EDMX-diagrammet, men jag har hört att det är dålig praxis.



  1. Kämpar med våren SimpleJdbcCall för att anropa Oracle-funktionen

  2. Oracle SQL returnerar rader på godtyckligt sätt när ingen order by-sats används

  3. Välj Data via en tabellvärderad funktion i SQL Server

  4. Hur konverterar/gjuter man varchar till datum?