2012-05-29 69 views
2

我創建了一個名爲'Item'的實體。它有一個Id,CreateDate和ModifyDate以及一些必需的數據。EF代碼優先 - 身份和計算列

我正在使用EF 4.3 Code First模型。如果能解決我的問題,我可以使用最新版本的EF。

所有這三個值都是可選的。有時,我可能會傳遞一些值,比如Id或CreateDate。如果我沒有通過,我希望EF從數據庫自動生成這些值,否則採用我通過的那個值。

到目前爲止我發現,如果我將Id列作爲Identity列,那麼它會忽略提供的值,對於計算列也是如此。

無論如何我會有選擇提供這些價值?

還有一件事,我有修改日期字段。每當我更新記錄時,我都希望DB更新當前的日期時間。我發現以下選項,但不知何故,我對其中的任何一個都不滿意。有沒有DB的直接選項(比如默認值)?

  1. 使用更新觸發更新modifydate
  2. 在C#側設置modifydate值

我的實體:

public class Item 
{ 
    public Guid? ItemId { get; set; } 

    public string SomeData { get; set; } 

    public DateTime CreateDate { get; set; } 

    public DateTime? ModifyDate { get; set; } 
} 

回答

0
  • 可以在構造函數中設置默認值的Item
  • 對於修改日期,我總是使用數據庫觸發器,因爲您不想依賴不同機器上的時鐘。
+0

是的,我們可以使用構造函數來完成它,但是我想從DB中獲取它,這是因爲您後面提到的想要依賴於DB時鐘而不是不同的機器的原因。 – Hitesh

+0

當然可以。 ItemId仍然可以由構造函數設置,並通過插入觸發器創建日期。 –

2

所有這三個值都是可選的。有時,我可能會通過一些值 說Id或CreateDate。如果我沒有通過,我希望EF自動從DB生成這些值 ,否則採取我通過的那個。

這在EF中是不可能的。 EF只支持兩種機制:

  • 值總是被
  • 值始終是由數據庫提供的應用程序提供了通過使用身份或計算設定

的原因是怎樣的方式默認值由數據庫處理。只有在INSERT命令沒有明確設置列的情況下才使用它們,但EF始終明確地設置所有列(即使您沒有設置值,因爲使用了默認的.NET值),除了標有標識或計算設置的列以外。

因此,需要第三個機制爲您的方案:

  • 與觸發設置默認值,如果它們不存在或包含。NET的默認值

問題是,如果沒有將屬性標記爲計算或標識,您將不會自動返回這些值。如果插入新記錄或更新現有記錄,則實體實例仍將包含舊值(或默認的.NET值),除非您強制對數據庫執行新查詢以刷新當前實體。這就是身份和計算設置存在的原因 - 在插入或更新期間自動返回這些值。

當您使用EF時,所有這些更改應該在您的應用程序中進行,而不是通過觸發器在數據庫中進行。