あはは!私の素晴らしい同僚はアイデアを思いつき、それはうまくいきました!
EFコードに入れてみました
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<EntityClass>().Property(p => p.TIMESTAMP).HasPrecision(6);
}
そして、DateTime.Now
ミリ秒単位でデータベースに保存されました
更新-私がこの苦境に陥った経緯について言及する価値があります
「テスト」アプリケーションで最初にモデルを使用してデータベースを構築する
- 私のアプリはSQLServerとOracleの両方で動作する必要があります。だから...
- EDMX図でデータベースを設計することから始めました
- 図が完成したら、SQLServerのDDLを生成しました。
-
何らかの理由で、Oracle EFプロバイダーがDDLを生成できなかったため、SQL Server DDLに手動で変更を加えて、構文的に正しくなるようにしました。
最初の問題 -私のOracleDDLは、タイムスタンプの代わりに日付を使用していました。必ずタイムスタンプを使用してください!!! OracleのDateTimeはミリ秒を格納しません。
実際のソリューションのためにデータベースから最初にコードを使用する
- アプリでコードファーストアプローチを使用したかった(私の好みです。メンテナンスが簡単だと思います)
- そこで、SQL Serverデータベースに接続し、そのスキーマからすべてのクラスを生成しました。
- すべての単体テストに合格した後、Oracleデータベースでテストすることにしました
- DATEからTimestampに変更した後でも、ミリ秒単位で問題が発生していました。
-
TIMESTAMP(6)
を使用して、テストVisualStudioソリューションで別のCodeFirstモデルを生成しました。OnModelCreating
を見たときを除いて、Oracleと入力します。 コード、HasPrecision(6)
では何も生成されませんでした また、生成されたC#POCOクラスのプロパティにデコレータはありませんでした。 -
HasPrecision(6)
があるかどうか気づきましたOnModelCreating
のコード 、コードファーストCreateDatabase()
実際にOracleのTIMESTAMP(6)
を作成します 。そうしないと、OracleEFプロバイダーはDATE
を使用します。
モデルファーストのアプローチを実行すれば、EDMXダイアグラムで精度の値を設定できると思いますが、それは悪い習慣だと聞いています。