2

私たちのアプリは多くの Web サーバーで実行されます。予想されるように、これらの Web サーバーの時間は時間の経過とともに歪む可能性があります。データベースは、独自の時間を持つ単一の独立したマシンです。EF 5.0 を使用しており、複数の列で非常に正確で一貫した時間を必要とするテーブルがあります。このテーブルの日付列が常にデータベース サーバーの時刻を使用していることを確認したいと思います。

SQL では、列を GetUtcDate() に設定するだけです。簡単です。日付が計算され、データベース サーバーに設定されます。しかし、挿入または更新で EF を使用してこれを行うにはどうすればよいでしょうか? 明確にするために、値がデータベースサーバーから取得されるように、列を関数 GetUtcDate() に設定するために EF によって生成された SQL が必要です。Web サーバーで日付を計算したくありません。私が見て検討したいくつかのアイデアと、それらがうまくいかない理由:

1) スキーマの列にデフォルト値を使用できます。しかし、挿入だけでなく、一貫した日付も必要とする多くの更新シナリオがあります。2) データベースでトリガーを使用できます。しかし、現在、データベースにはロジックがありません (結局、ORM を使用しています)。回避できるのであれば、その前例を設定したくありません。また、データベース側でこれらの列をいつ更新するかを決定することも困難です。3)データベースサーバーの時間を手動で取得し(以下の例のように別のクエリ)、列をその値に設定してから更新できます。ただし、データベースへの追加の呼び出しが必要になるため、これは非常に非効率的です。タイトなループでは、これはオーバーヘッドが大きすぎます。さらに、少なくとも一貫性はありますが、ミリ秒前に時間を取得したため、時間の精度が低下しました。

 CreateQuery<DateTime>("CurrentUtcDateTime()").Execute().First();

それで、これを行う正しい方法は何ですか?それとも、ここで EF に正しいことをさせることさえ可能ですか?

4

1 に答える 1

0

この質問は本当に、EF に DB/基になるプロバイダーから日付/時刻を取得するように指示できますか? 私の知る限り、これは EF ステートメントでは不可能です。Get DBTime T-SQL GetDate 希望の日付オプションを選択する前に、単純な SQL ステートメントを使用する必要があります

        var dq = context.Database.SqlQuery<DateTime>("select GETUTCDATE();");
        DateTime serverDate;
        foreach (var dt in dq) {
            serverDate = dt;
        }

ここで、EF linq ステートメントで serverDate を使用します。

于 2013-08-22T01:05:12.557 に答える