Aha! Mój wspaniały kolega wpadł na pomysł i zadziałał!
W naszym kodzie EF próbowaliśmy umieścić
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<EntityClass>().Property(p => p.TIMESTAMP).HasPrecision(6);
}
A potem DateTime.Now
z milisekundami zostały zapisane w bazie danych
Aktualizacja - warto wspomnieć, jak znalazłem się w tej sytuacji
Budowanie bazy danych za pomocą Model First w „testowej” aplikacji
- Moja aplikacja musi działać zarówno z SQL Server, jak i Oracle. Więc...
- Zacząłem od zaprojektowania mojej bazy danych na diagramie EDMX
- Po wykonaniu diagramu wygenerowałem DDL dla SQL Server.
-
Z jakiegoś powodu dostawca Oracle EF nie mógł wygenerować DDL, więc zacząłem ręcznie wprowadzać zmiany w SQL Server DDL, aby było to poprawne składniowo
Pierwszy problem - mój Oracle DDL używał daty zamiast znacznika czasu. Upewnij się, że używasz znacznika czasu!!! DateTime w Oracle nie przechowuje milisekund.
Korzystanie z Code First z bazy danych dla rzeczywistego rozwiązania
- Chciałem, aby aplikacja korzystała z podejścia Code First (tylko moje preferencje. Myślę, że jest łatwiejsza w utrzymaniu)
- Więc połączyłem się z bazą danych SQL Server i wygenerowałem wszystkie moje klasy z tego schematu.
- Zdałem wszystkie moje testy jednostkowe, a następnie zdecydowałem się przetestować je z bazą danych Oracle
- Nawet po zmianie z DATE na sygnaturę czasową nadal miałem problemy z upływającymi milisekundami.
- Wygenerowałem kolejny model Code First w testowym rozwiązaniu Visual Studio z
TIMESTAMP(6)
wpisz Oracle, z wyjątkiem sytuacji, gdy spojrzałem naOnModelCreating
kod, nie wygenerował niczego za pomocąHasPrecision(6)
nie było też żadnych dekoratorów na właściwości w wygenerowanej klasie C# POCO. - Zauważyłem, że masz
HasPrecision(6)
kod w TwoimOnModelCreating
, Code FirstCreateDatabase()
faktycznie utworzy OracleTIMESTAMP(6)
. Jeśli tego nie zrobisz, dostawca Oracle EF użyjeDATE
Myślę, że jeśli zastosujesz podejście Model First, możesz ustawić wartości precyzji na diagramie EDMX, ale słyszałem, że to zła praktyka.