Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Der Oracle Entity Framework-Anbieter speichert DateTime.Now nicht mit Millisekunden

Aha! Mein toller Kollege hatte eine Idee und es hat funktioniert!

In unserem EF-Code haben wir versucht,

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

Und dann DateTime.Now mit Millisekunden in die Datenbank gespeichert

Update – es ist erwähnenswert, wie ich in diese missliche Lage geraten bin

Erstellen der Datenbank mit Model First in einer "Test"-Anwendung

  1. Meine App muss sowohl mit SQL Server als auch mit Oracle funktionieren. Also...
  2. Ich begann damit, meine Datenbank in einem EDMX-Diagramm zu entwerfen
  3. Sobald das Diagramm fertig war, generierte ich die DDL für SQL Server.
  4. Aus irgendeinem Grund konnte der Oracle EF-Anbieter die DDL nicht generieren, also habe ich manuell Änderungen an der SQL Server-DDL vorgenommen, damit sie syntaktisch korrekt ist

    1. Problem - Meine Oracle-DDL verwendete ein Datum anstelle eines Zeitstempels. Stellen Sie sicher, dass Sie Timestamp verwenden!!! DateTime in Oracle speichert keine Millisekunden.

Verwenden von Code First aus der Datenbank für die eigentliche Lösung

  1. Ich wollte, dass die App den Code First-Ansatz verwendet (nur meine Präferenz. Ich denke, es ist einfacher zu warten)
  2. Also habe ich mich mit der SQL Server-Datenbank verbunden und alle meine Klassen aus diesem Schema generiert.
  3. Ich habe alle meine Komponententests bestanden und mich dann entschieden, sie mit der Oracle-Datenbank zu testen
  4. Selbst nach dem Wechsel von DATE zu Timestamp hatte ich immer noch Probleme mit der Eingabe von Millisekunden.
  5. Ich habe ein weiteres Code First-Modell in einer Visual Studio-Testlösung mit einem TIMESTAMP(6) generiert Geben Sie Oracle ein, außer wenn ich mir das OnModelCreating angesehen habe code, es hat nichts mit HasPrecision(6) generiert Es gab auch keine Dekorateure für die Eigenschaft in der generierten C#-POCO-Klasse.
  6. Mir ist aufgefallen, dass Sie HasPrecision(6) haben Code in Ihrem OnModelCreating , der Code FirstCreateDatabase() wird tatsächlich ein Oracle TIMESTAMP(6) erstellen . Wenn Sie dies nicht tun, verwendet der Oracle EF-Anbieter DATE

Ich denke, wenn Sie den Model First-Ansatz verwenden, können Sie Präzisionswerte im EDMX-Diagramm festlegen, aber ich habe gehört, dass dies eine schlechte Praxis ist.