2014-03-06 39 views
1

我們希望將當前日期時間放入數據庫列。通過實體框架插入當前數據庫日期時間

我們有一個Web服務器,其中Web服務器上的時間可能會有所不同,因此我們需要在數據庫服務器上使用日期時間。

我們有一個包含Not Null datetime列的數據庫。此列具有當前時間的默認日期時間。

當我們使用不包含datetime列的SQL語句插入數據時,這可以正常工作。

從實體框架:

  • 如果我們定義的日期時間爲not null,日期時間設置爲低電平日期,低日期被插入到數據庫中。
  • 如果我們將日期時間定義爲null,我們會在插入時得到一個異常,該值不能爲空。

我們可以使用數據庫觸發器修復此問題,如果插入值爲低日期,則將日期時間更改爲當前日期時間。

有沒有人有更好的解決方案?

回答

2

作爲柱具有由可以簡單地標記日期時間列數據庫中設置的默認值作爲計算:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
property DateTime Date { get; set; } 

或流利映射

this.Property(t => t.Date) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 

EntityTypeConfiguration類,或

modelBuilder.Entity<MyClass>().Property(t => t.Date) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 

OnModelCreating覆蓋。

這將導致EntityFramework在每次讀取,插入或更新記錄時讀取列的值,但它不會設置它。

+0

感謝您的答案,如果我們有一個EDMX文件,這也工作嗎?每次edmx更改和我重新生成的代碼時,我們是否需要讀取屬性? –

+0

在edmx中,您可以在設計器的列的屬性窗口中將'StoreGeneratedPattern'設置爲'Computed'。這將在模型更新中倖存。 –

+0

謝謝,我們正在使用DB2。 DB2驅動程序不支持「計算」,但我們能夠使用「身份」。雖然它不是標識列,但它解決了將低日期發送到數據庫的問題。 –

0

一種方法是使用UTC日期時間,以便在C#中,你可以使用

DateTime.UtcNow 

您還可以設置

DateTime dateTime = new DateTime(); 
dateTime = SqlDateTime.MinValue.Value; 

你甚至可以創建擴展方法:

public static class DateExtension 
    { 
     public static DateTime SqlValidDateTime(this DateTime d) 
     { 
      return SqlDateTime.MinValue.Value; 
     } 
    } 

而且用於:

如果我們將datetime定義爲null,則插入 的值不能爲null。

您應該傳遞,而不是空 - >

DbNull.Value 

,然後插入應該通過。

+0

從@Shiraz的問題來看,他想要的是服務器數據庫中的當前日期時間,而不是可以分配的最小DateTime ... – yosbel

+0

@yosoy是正確的,此代碼將從系統時鐘在Web服務器上,所以不幸的是它並沒有幫助 –

相關問題