整理兩個跟 Entity Framework 處理欄位預設值有關的問題:(1) 如何設定 entity 的欄位預設值? (2) 當資料表中的某個欄位有指定預設值,例如 CreatedTime 欄位的預設值為 getdate(),透過 Entity Framework 5 異動資料時,該預設值的設定卻沒作用?
問: 如何設定欄位的預設值?
答: 在 Visual Studio 中開啟 .edmx 檔案,在模型編輯器中點選 entity 的屬性,然後到屬性視窗中設定其 Default Value 屬性。參考下圖:
或者也可以用程式碼來達成這個目的。方法很多,例如:
在呼叫 DbContext 的 SaveChanges 方法之後,該筆記錄的 ModifiedDate 欄位值卻仍是 null。
使用的工具是 Visual Studio 2012 + Entity Framework 5。
答: 在 Visual Studio 中開啟你的 .edmx 檔案,在模型編輯器中點選 entity 的欄位,然後到屬性視窗中把這個欄位的 StoreGeneratedPattern 屬性值由預設的 None 改為 Computed,如下圖所示:
修改之後,.edmx 檔案內容會產生如下變動:
Visual Studio 2010 + Entity Framework 4 也是同樣的情形,同樣的解法。
問: 如何設定欄位的預設值?
答: 在 Visual Studio 中開啟 .edmx 檔案,在模型編輯器中點選 entity 的屬性,然後到屬性視窗中設定其 Default Value 屬性。參考下圖:
或者也可以用程式碼來達成這個目的。方法很多,例如:
- 在 entity 類別的建構函式中設定初始值。
- 改寫 ObjectContext 的 SaveChanges 方法,在儲存資料之前動手腳。
- 參考:Entity Framework Code First & Default Column Values
- 參考:Entity Framework 4 and Default Values
問: 在設計資料庫時明明有指定欄位的預設值,可是每次透過 EF 新增資料時,該欄位的值卻是 null?
例如某資料表有個 ModifiedDate 欄位,其預設值為 getdate(),如下圖所示:
例如某資料表有個 ModifiedDate 欄位,其預設值為 getdate(),如下圖所示:
在呼叫 DbContext 的 SaveChanges 方法之後,該筆記錄的 ModifiedDate 欄位值卻仍是 null。
使用的工具是 Visual Studio 2012 + Entity Framework 5。
答: 在 Visual Studio 中開啟你的 .edmx 檔案,在模型編輯器中點選 entity 的欄位,然後到屬性視窗中把這個欄位的 StoreGeneratedPattern 屬性值由預設的 None 改為 Computed,如下圖所示:
修改之後,.edmx 檔案內容會產生如下變動:
Visual Studio 2010 + Entity Framework 4 也是同樣的情形,同樣的解法。
老師您好
回覆刪除StoreGeneratedPattern 屬性值由預設的 None 改為 Computed 時, ModifiedDate 會是 DB 的預設值,這個沒問題。
之後再把這筆資料再取出更新 ModifiedDate 欄位, ModifiedDate = DateTime.Now;,這時這個欄位並不會被修改到。
請問有沒有解決的辦法呢?
謝謝
Hi Eason,
回覆刪除當一個欄位的 StoreGeneratedPattern 屬性為 Computed 時,無論新增還是修改,Entity Framework 都不會更新至資料庫,因為它會認為資料庫那一端會產生新的值。因此,需要修改的欄位,其 StoreGeneratedPattern 應該設定為 None,並且自行撰寫程式碼來設定其欄位值。如果你需要在新增一筆紀錄時指定其預設值,則可參考本文中提及的幾種方法。