Entity Framework 欄位預設值相關問題

整理兩個跟 Entity Framework 處理欄位預設值有關的問題:(1) 如何設定 entity 的欄位預設值? (2) 當資料表中的某個欄位有指定預設值,例如 CreatedTime 欄位的預設值為 getdate(),透過 Entity Framework 5 異動資料時,該預設值的設定卻沒作用?


問: 如何設定欄位的預設值?

: 在 Visual Studio 中開啟 .edmx 檔案,在模型編輯器中點選 entity 的屬性,然後到屬性視窗中設定其 Default Value 屬性。參考下圖:



或者也可以用程式碼來達成這個目的。方法很多,例如:

問: 在設計資料庫時明明有指定欄位的預設值,可是每次透過 EF 新增資料時,該欄位的值卻是 null?

例如某資料表有個 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 也是同樣的情形,同樣的解法。

2 則留言:

  1. 老師您好

    StoreGeneratedPattern 屬性值由預設的 None 改為 Computed 時, ModifiedDate 會是 DB 的預設值,這個沒問題。
    之後再把這筆資料再取出更新 ModifiedDate 欄位, ModifiedDate = DateTime.Now;,這時這個欄位並不會被修改到。
    請問有沒有解決的辦法呢?
    謝謝

    回覆刪除
  2. Hi Eason,
    當一個欄位的 StoreGeneratedPattern 屬性為 Computed 時,無論新增還是修改,Entity Framework 都不會更新至資料庫,因為它會認為資料庫那一端會產生新的值。因此,需要修改的欄位,其 StoreGeneratedPattern 應該設定為 None,並且自行撰寫程式碼來設定其欄位值。如果你需要在新增一筆紀錄時指定其預設值,則可參考本文中提及的幾種方法。

    回覆刪除

技術提供:Blogger.
回頂端⬆️