sql >> データベース >  >> RDS >> Oracle

OracleEntityFrameworkプロバイダーはDateTime.Nowをミリ秒単位で格納しません

    あはは!私の素晴らしい同僚はアイデアを思いつき、それはうまくいきました!

    EFコードに入れてみました

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

    そして、DateTime.Now ミリ秒単位でデータベースに保存されました

    更新-私がこの苦境に陥った経緯について言及する価値があります

    「テスト」アプリケーションで最初にモデルを使用してデータベースを構築する

    1. 私のアプリはSQLServerとOracleの両方で動作する必要があります。だから...
    2. EDMX図でデータベースを設計することから始めました
    3. 図が完成したら、SQLServerのDDLを生成しました。
    4. 何らかの理由で、Oracle EFプロバイダーがDDLを生成できなかったため、SQL Server DDLに手動で変更を加えて、構文的に正しくなるようにしました。

      最初の問題 -私のOracleDDLは、タイムスタンプの代わりに日付を使用していました。必ずタイムスタンプを使用してください!!! OracleのDateTimeはミリ秒を格納しません。

    実際のソリューションのためにデータベースから最初にコードを使用する

    1. アプリでコードファーストアプローチを使用したかった(私の好みです。メンテナンスが簡単だと思います)
    2. そこで、SQL Serverデータベースに接続し、そのスキーマからすべてのクラスを生成しました。
    3. すべての単体テストに合格した後、Oracleデータベースでテストすることにしました
    4. DATEからTimestampに変更した後でも、ミリ秒単位で問題が発生していました。
    5. TIMESTAMP(6)を使用して、テストVisualStudioソリューションで別のCodeFirstモデルを生成しました。 OnModelCreatingを見たときを除いて、Oracleと入力します。 コード、HasPrecision(6)では何も生成されませんでした また、生成されたC#POCOクラスのプロパティにデコレータはありませんでした。
    6. HasPrecision(6)があるかどうか気づきました OnModelCreatingのコード 、コードファーストCreateDatabase() 実際にOracleのTIMESTAMP(6)を作成します 。そうしないと、OracleEFプロバイダーはDATEを使用します。

    モデルファーストのアプローチを実行すれば、EDMXダイアグラムで精度の値を設定できると思いますが、それは悪い習慣だと聞いています。



    1. エージェントベースの監視とエージェントレスの監視のどちらを使用するかを決定します

    2. PL / SQL:数値または値のエラー:文字列バッファが小さすぎます%ROWTYPE

    3. トランザクション内のエラーを無視するようにPostgresqlに依頼できますか

    4. データベースをPostgresからMySQLに移行する