Oracle
 sql >> Database >  >> RDS >> Oracle

Il provider Oracle Entity Framework non archivia DateTime.Now con millisecondi

Ah! Il mio fantastico collega ha avuto un'idea e ha funzionato!

Nel nostro codice EF abbiamo provato a inserire

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

E poi DateTime.Now con millisecondi è stato memorizzato nel database

Aggiornamento:vale la pena ricordare come sono finito in questa situazione

Costruzione del database con Model First in un'applicazione di "test"

  1. La mia app deve funzionare sia con SQL Server che con Oracle. Allora...
  2. Ho iniziato progettando il mio database in un diagramma EDMX
  3. Una volta terminato il diagramma, ho generato il DDL per SQL Server.
  4. Per qualche motivo il provider Oracle EF non è stato in grado di generare il DDL, quindi ho provveduto ad apportare manualmente le modifiche al DDL di SQL Server in modo che fosse sintatticamente corretto

    1° problema - il mio Oracle DDL utilizzava una data anziché un timestamp. Assicurati di utilizzare Timestamp!!! DateTime in Oracle non memorizza i millisecondi.

Utilizzo di Code First dal database per la soluzione effettiva

  1. Volevo che l'app utilizzasse l'approccio Code First (solo una mia preferenza. Penso che sia più facile da mantenere)
  2. Quindi mi sono connesso al database di SQL Server e ho generato tutte le mie classi da quello schema.
  3. Ho superato tutti i miei unit test e poi ho deciso di testarlo con il database Oracle
  4. Anche dopo essere passato da DATE a Timestamp, continuavo ad avere problemi con i millisecondi in entrata.
  5. Ho generato un altro modello Code First in una soluzione di Visual Studio di prova con un TIMESTAMP(6) digita Oracle, tranne quando ho esaminato OnModelCreating codice, non ha generato nulla con HasPrecision(6) né c'erano decoratori sulla proprietà nella classe C# POCO generata.
  6. Ho notato se hai HasPrecision(6) codice nel tuo OnModelCreating , il codice primaCreateDatabase() creerà effettivamente un Oracle TIMESTAMP(6) . In caso contrario, il provider Oracle EF utilizzerà DATE

Penso che se utilizzi l'approccio Model First puoi impostare valori di precisione nel diagramma EDMX, ma ho sentito che è una cattiva pratica.