2017-04-14 3 views
0

私はSQL Serverデータベースを持っています。私のテーブルの1つにSQL DATETIMEカラムがあります。この列は、レコードの作成時に入力する必要はありませんが、後で変更する必要があります。ASP.NET MVC 5でデフォルトのDateTimeを使用する正しい方法

DateTimeはnull可能ではないことをご理解ください。 datetime2の既定値は1/1/0001ですが、SQL Serverの最小値は1/1/1753です。

Why when I insert a DateTime null I have "0001-01-01" in SQL Server?

だから、私の質問は、これを行うための正しい方法は何ですか? po.PODateをSQL Serverの最小値(1/1/1753)に設定するにはどうすればいいですか。

ApplicationDbContext db = new ApplicationDbContext(); 

PurchaseOrder po = new PurchaseOrder(); 
po.PODate = new DateTime(1753, 1, 1); // Best way? 
// po.PODate = DateTime.MinValue; Doesn't work because DateTime.MinValue is 1/1/0001 
// po.PODate = null;    Doesn't work because DateTime is non-nullable value type 
// po.PODate = DBNull.value;  Doesn't work because it is for type System.DBNull not DateTime 

db.PurchaseOrders.Add(po); 
db.SaveChanges(); 
+1

なぜレコードを作成するときに 'DateTime.Now'を使用しないのですか? –

+0

私はPODateのデフォルト値を現在の時刻にしたくないので、決して起こらないはずの "ばかげた" DateTimeにしたいと思っています。後で、時間は現実的なDateTimeに変更されます。 –

+1

次に、nullを受け入れるようにプロパティを変更します。 'DateTime PODate {get;セット; } 'と' DateTime? PODate {get;セット; } '。偽の(またはばかげた)データを提供することはベストプラクティスではありません。データを必要としない場合は、それを 'NULL'として設定し、後でその値を更新します。 –

答えて

0

日付がNULL可能ではないと予想される場合は、あなたが持っているものが最良の方法です。 EFは常にそのフィールドに値を渡します。そうしないと、1/1/0001とエラーで合格しようとします。

はそれを毎回定義するのではなく、あなたが静的クラスを作成することができます。

public static DateTime MinDate() 
{ 
    return new DateTime(1753, 1, 1); 
} 

あなたはそれを標準化したい場合。

もう1つのオプションは、列をNULLにすることです。また、日付を照会するときはいつでも、SQLがNULLのときに1/1/1753を返します。

+0

うーん、私は1つの場所でしか使用しないので、静的クラスを作る価値はないと思います。しかし、それは私が多くの場所でそれを使用していたなら、私が探していたものです。 null可能なものについては、IdentityModel.ApplicationDbContextのメソッドOnModelCreatingをオーバーライドしようとしましたが、それには次のようにします: 'modelBuilder.Entity ()。Property(m => m.PODate).IsOptional( ); base.OnModelCreating(modelBuilder); ' –

+0

null可能なものを試していたら、タイプを「DateTime?」に変更することができます。 DateTimeの場合、私はIsOptional()が助けになるかどうか分かりませんが、潜在的に1/1/1753に設定することができますか? –

関連する問題