2017-04-14 44 views
0

我有一个SQL Server数据库。其中一个表有一个SQL DATETIME列。创建记录时不必输入此列,但稍后应该修改。在ASP.NET MVC中使用默认DateTime的正确方法5

我知道DateTime是不可空的。 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。稍后,时间将更改为现实的日期时间。 –

+1

然后只需修改你的属性接受null。 'DateTime PODate {get;组; ''到'DateTime? PODate {get;组; }'。提供虚假(或荒谬)的数据不是最佳实践。如果您不需要将数据设置为NULL,并稍后更新它的值。 –

回答

0

如果您预计日期不能为空,那么是的,您拥有的是最好的方法。无论如何,EF总是将一个值传递给该字段,所以如果不这样做,它将尝试在1/1/0001中传递错误。

不是必须每次都定义它,你可以创建一个静态类:

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

如果你想规范它。

另一个选项是使列可以为空,并且任何时候您查询日期时,SQL返回null时为1/1/1753。

+0

嗯,我只在一个位置使用它,所以我认为这不值得创建静态类。但是,如果我要在很多地方使用它,那是我正在寻找的。对于可为空的事情,我尝试覆盖IdentityModel.ApplicationDbContext中的方法OnModelCreating(但它没有做任何事情),如下所示:'modelBuilder.Entity ()。Property(m => m.PODate).IsOptional ); base.OnModelCreating(modelBuilder);' –

+0

如果您尝试可以为空的东西;那么您可以将类型更改为“DateTime?”。如果是DateTime,我不知道IsOptional()会有所帮助,但是可能的话,您可以使用它将其设置为1/1/1753也许? –

相关问题