2012-05-23 49 views
5

我想在我的Accounts表中的列CreatedDate,定義如下:如何在EF code-first 4.3中爲CreatedDate列使用數據庫默認值?

CreatedDate DATETIME NOT NULL DEFAULT GETUTCDATE() 

這將映射到類CreatedDate屬性:

public class Account 
{ 
    public DateTime? CreatedDate { get; private set; } 
    // ... other properties ... 
} 

當創建一個新帳戶,我想離開CreatedDate設置爲NULL,並讓數據庫填充它。當從數據庫加載現有帳戶時,我想EF檢索數據庫生成的CreatedDate。

我使用EF 4.3代碼優先顯式遷移。當EF產生的遷移帳務表,我修改它如下:

CreatedDate = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"), 

不幸的是,當我嘗試映射使用EF 4.3該表中,EF試圖插入NULL值在CreatedDate列。

我試着爲屬性as suggested by Ladislav Mrnka設置DatabaseGeneratedOption.Identity。但是,這會從主鍵屬性中刪除標識選項。我嘗試使用DatabaseGeneratedOption.Computed代替,但它繼續嘗試插入NULL。我恢復了所有的移民並重新開始他們 - 問題仍然存在。

下面是我在做什麼在OnModelCreating

modelBuilder.Entity<Account>().Property(a => a.CreatedDate) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 

有沒有人有什麼建議?

感謝您的幫助,
理查德

回答

4

讓你的約會對象非可空在實體或數據庫空。僅當insert語句不發送顯式值時才使用數據庫默認值。如果使用EF,只有在您將CreatedDate標爲DatabaseGeneratedOption.Identity時纔會發生這種情況。如果它從主鍵中刪除默認標識,則通過數據標註或流暢API手動強制標識。

+0

謝謝拉迪斯拉夫!有用。我使用DatabaseGeneratedOption.Identity標記了CreatedDate和我的ID列。我把它留在我的實體中可爲空,而在數據庫中不可爲空 - 但是使用Identity選項,它不再插入顯式NULL。 –

相關問題