2009-10-22 105 views
12

在我的SQL Server數據庫架構我有一個數據表,它包含如何使用默認的實體框架和默認的日期值

CONVERT(VARCHAR(10), GETDATE(), 111) 

的默認值,是理想的自動插入日期日期字段在將記錄手動輸入到數據庫中時將其添加到新記錄中。

我遇到的問題是,當使用實體框架和映射Date字段時,實體框架在實體實例化時插入默認值DateTime.Min。

我不能將日期字段映射到可爲空的DateTime(即DateTime?),也不能在實體設計器的默認值中使用CONVERT或DateTime.Now.Today,因爲它只接受硬編碼的常量值。

我當然可以在C#中明確設置DateTime字段,無論是在代碼中,在部分類的構造函數中,還是在保存更改事件期間創建對象。

是否有任何其他方式實現我想要的數據庫表中存儲的默認值計算實際使用?

+0

您可以嘗試將該字段設置爲自動生成。我從來沒有嘗試過這一點,我不知道它會如何工作。 – 2009-10-22 19:23:21

+0

我在EDM設計器中環顧四周,沒有看到任何可以描述的選項,菜單項或屬性。在哪裏可以找到設計器中的「設置字段爲自動生成」? 我假設你指的是設計者,而不是SQL Server中的東西。 或者你也許是指「計算列規格?」 – Justin 2009-10-22 22:03:34

+1

http://msdn.microsoft.com/en-us/library/dd296755.aspx – 2009-10-26 12:58:59

回答

1

我剛剛遇到了這個問題 - 我通過使用部分方法在實體的構造函數中設置日期(我需要自動生成的字段)來解決此問題。無論這是理想的還是它在所有情況下都能正常工作還有待觀察,但它已經解決了我迄今爲止的問題。

+1

這是我最終選擇的解決方案。它似乎有點混亂,但它完美無瑕。在EF中存在這種疏忽的恥辱。 – Justin 2009-10-28 23:54:07

+0

很高興有幫助,讓我們希望EF4修復這一點痛苦。如果您認爲這是您可能找到的最佳解決方案,請將其標記爲答案(或者至少提升它的答案),這樣我可以獲得一些功勞 - 我試圖建立至少足夠的代表來更積極地使用本網站。謝謝! – 2009-11-02 15:15:30

+1

我會這樣做,但它需要15點聲望。抱歉。 – Justin 2009-11-06 02:45:37

5

您可以使用database trigger,它在插入時檢查插入的值是否爲DateTime.MinValue(01.01.0001)並將其替換爲您所需的計算值。這MSDN article描述如何創建一個觸發器。

有點「缺陷」:有了這個解決方案,您將不得不將新對象存儲到數據庫中,然後再讀回來用計算值更新對象。

+2

好點。這也會起作用。但它只是感覺我正在揮舞大錘來破解核桃。 – Justin 2009-10-22 22:00:45

0

日期字段可以映射到DateTime?只有在數據庫中該列可以爲空時。

+0

但是,如果列可以爲空,那麼邏輯規定您不能擁有「默認值」。這就是SQL服務器所表現的行爲。 – Justin 2009-10-28 23:59:40

14

爲您的EntityObject創建一個部分類,添加一個默認構造函數,並在其中設置默認值。

public partial class YourDBObject 
    { 
      public YourDBObject() 
      { 
       this._DateField = DateTime.Now; 
      } 
    } 
+0

正是我需要的(雖然不是這個問題)! :D – nathanchere 2010-04-07 06:28:27

+3

謝謝。儘管它起初讓我感到困惑,因爲構造函數在從數據庫中提取現有對象時也會被調用,但在這些情況下,DateTime.Now會在構造後被數據庫值覆蓋。 – codeulike 2010-10-05 10:32:55

1

我在使用RIA服務和實體框架時遇到過類似的問題。我無法在客戶端的默認構造函數中設置該值,因爲在那裏生成的實體類已經有一個空的默認構造函數。

我使用的解決方案是通過設置所需的默認值爲客戶端上的實體實現OnCreated部分方法。

2

這真是不幸。引用StoreGeneratedPattern的答案不是真正的解決方案,它不允許您設置該值。

所有球隊必須做的是這樣的:

[Required] 
    [DefaultValue] // suggested attribute, whatever you want to call it 
    public DateTime Created { get; set; } 

如果一個字段被標記默認值,然後在英孚的SQL生成時間,該屬性的屬性得到遏制,如果field == default(DateTime),如果是這樣,那麼只需從生成的代碼中省略該列即可。

0

恰好碰巧遇到了這個問題。實體框架本身不支持默認值。您需要在Edmx文件實體的列上設置屬性StoreGeneratedPattern = Computed。您在數據庫中設置的默認值將優先於EF默認設置的值,即DateTime.Min