2017-04-14 68 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也許? –

相關問題