Aha! Můj úžasný kolega měl nápad a fungovalo to!
V našem EF kódu jsme zkusili vložit
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<EntityClass>().Property(p => p.TIMESTAMP).HasPrecision(6);
}
A pak DateTime.Now
s milisekundami se uloží do databáze
Aktualizace – stojí za zmínku, jak jsem se do této nesnáze dostal
Budování databáze s Model First v "testovací" aplikaci
- Moje aplikace musí fungovat se serverem SQL Server i Oracle. Takže...
- Začal jsem návrhem databáze v EDMX diagramu
- Jakmile byl diagram hotový, vygeneroval jsem DDL pro SQL Server.
-
Z nějakého důvodu poskytovatel Oracle EF nemohl vygenerovat DDL, takže jsem přistoupil k ručnímu provedení změn v SQL Server DDL, aby to bylo syntakticky správné
1. problém - můj Oracle DDL používal datum místo časového razítka. Ujistěte se, že používáte Timestamp!!! DateTime v Oracle neukládá milisekundy.
Použití Code First z databáze pro skutečné řešení
- Chtěl jsem, aby aplikace používala přístup Code First (pouze moje preference. Myslím, že je to jednodušší na údržbu)
- Připojil jsem se tedy k databázi SQL Server a vygeneroval všechny své třídy z tohoto schématu.
- Prošel jsem všemi testy jednotek a rozhodl jsem se to otestovat s databází Oracle
- I po změně z DATE na Timestamp jsem měl stále problémy s přibývajícími milisekundami.
- Vygeneroval jsem další model Code First v testovacím řešení vizuálního studia s
TIMESTAMP(6)
zadejte v Oracle, kromě případů, kdy jsem se podíval naOnModelCreating
kód, nevygenerovalo nic pomocíHasPrecision(6)
ani ve vygenerované třídě C# POCO nebyli na pozemku žádní dekoratéři. - Všiml jsem si, že máte
HasPrecision(6)
kód ve vašemOnModelCreating
, Code FirstCreateDatabase()
ve skutečnosti vytvoří OracleTIMESTAMP(6)
. Pokud tak neučiníte, poskytovatel Oracle EF použijeDATE
Myslím, že pokud použijete přístup Model First, můžete nastavit hodnoty přesnosti v EDMX diagramu, ale slyšel jsem, že je to špatný postup.