私たちのアプリは多くの Web サーバーで実行されます。予想されるように、これらの Web サーバーの時間は時間の経過とともに歪む可能性があります。データベースは、独自の時間を持つ単一の独立したマシンです。EF 5.0 を使用しており、複数の列で非常に正確で一貫した時間を必要とするテーブルがあります。このテーブルの日付列が常にデータベース サーバーの時刻を使用していることを確認したいと思います。
SQL では、列を GetUtcDate() に設定するだけです。簡単です。日付が計算され、データベース サーバーに設定されます。しかし、挿入または更新で EF を使用してこれを行うにはどうすればよいでしょうか? 明確にするために、値がデータベースサーバーから取得されるように、列を関数 GetUtcDate() に設定するために EF によって生成された SQL が必要です。Web サーバーで日付を計算したくありません。私が見て検討したいくつかのアイデアと、それらがうまくいかない理由:
1) スキーマの列にデフォルト値を使用できます。しかし、挿入だけでなく、一貫した日付も必要とする多くの更新シナリオがあります。2) データベースでトリガーを使用できます。しかし、現在、データベースにはロジックがありません (結局、ORM を使用しています)。回避できるのであれば、その前例を設定したくありません。また、データベース側でこれらの列をいつ更新するかを決定することも困難です。3)データベースサーバーの時間を手動で取得し(以下の例のように別のクエリ)、列をその値に設定してから更新できます。ただし、データベースへの追加の呼び出しが必要になるため、これは非常に非効率的です。タイトなループでは、これはオーバーヘッドが大きすぎます。さらに、少なくとも一貫性はありますが、ミリ秒前に時間を取得したため、時間の精度が低下しました。
CreateQuery<DateTime>("CurrentUtcDateTime()").Execute().First();
それで、これを行う正しい方法は何ですか?それとも、ここで EF に正しいことをさせることさえ可能ですか?