2016-11-03 8 views
1

私は新しい行が挿入されるたびに、現在の日時にCreatedDate列を設定したいので、私はこのようにそれを作った:、EF:作成された日付プロパティにデフォルト値を使用しても問題ありませんか?

public DateTime CreateDate { get; set; } = DateTime.Now; 

私はそれをテストし、それだけで正常に動作しますが、これは実用的なアプローチですか?私は多くの記事が非常に多くのコードで同じことを達成し、流暢なAPIを使用して、誰もこの単純な方法を言及していないのを見た?

+3

この問題は、アプリケーションサーバーが実行されている場所に基づいて生成されることがあります。ユーザーとのやりとりがあって、タイムゾーンを反映させたい場合、ユーザーはこれが機能しません。あなたのアプリケーションを知らなくても、これはあなたにとって問題ではないかもしれません。 –

答えて

3

これは達成したいことによって異なります。

私は多くの記事がそんなにコードで同じことを達成見て、流暢なAPIを使用して、

これらの記事のほとんどは、データベース・レベルでデフォルト値を追加する方法についてになります。あなたはそれをしていない。プレーンSQLを使用してテーブルに行を挿入し、CreatedDateの値を指定しないと、エラーが発生します。

あなたがしていることで、挿入するときには必ずCreatedDateをSQLで指定する必要があります。しかし、Entity Framework は、挿入時に常にをSQLで指定し、データベースレベルで設定されたデフォルト値はすべて無視します。

これはあなたが望むものです。デフォルト値はC#でオブジェクトを作成するときにのみ適用されます。そして、あなたがやっていることはまったく問題ありません。また、クラスのコンストラクタの中から値を設定するように記述することもできます。

@Alex Kozlowskiは良いコメントを出しますが、それはDateTime.Nowが挿入されると予想される値ではない可能性があります。どのシステムがコードを実行しているかによって異なります。タイムゾーンがサーバーのタイムゾーンと異なる場合や、時計が同期していない場合があります。

+0

この「サーバーの時刻の競合」の問題を回避するにはどうすればよいですか。 –

+1

@MohamedAhmedすべての時刻をUTCで保存することで、異なるタイムゾーンを避けることができますが、クロックがオフになっていることは、専用サーバー(通常はデータベースサーバー)に時刻を取得させることによって、そして、EFでうまくいくようにするには、避けようとしているデータベースレベルのデフォルトに正確に到達します。 – hvd

1

はい。この機能は、C#バージョン6以降で追加されました。これはC#-6以降でのみ有効です。そしてそれがあなたが多くの記事でそれを見つけられない理由です。

関連する問題