2013-06-11 54 views
5

當我將更改保存到數據庫中,我運行到以下異常:實體框架6碼首先在插入默認datetime值

Cannot insert the value NULL into column 'Registered', table 
'EIT.Enterprise.KMS.dbo.LicenseEntry'; column does not allow nulls. 
INSERT fails. The statement has been terminated. 

相關守則第一個模型屬性如下:

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember] 
public DateTime   Registered   { get; private set; } 

...這是爲什麼我很困惑:據我所知,通過提供註解[DatabaseGenerated(DatabaseGeneratedOption.Identity)我命令實體框架自動生成的場(在這種情況下:在創建時只有一次)

所以我期待有一個不可空(必填)的字段,而不可能在EF正在處理的地方手動修改字段。

我在做什麼錯?


注:

  1. 我不想用流利的API,因爲我想使用波蘇斯。
  2. 屬性defaultValueSql也不是一個選項,因爲我需要依賴數據庫爲此項目獨立(例如對於GETDATE())。
  3. 我使用實體框架6 alpha 3,Code First。
+0

AutoGenerate也是您的主鍵嗎?如果是這樣,您需要指定[key]註釋。 – Botonomous

+0

不,這只是一個屬性。 – Atrotygma

+1

我不相信DateTime數據類型支持標識字段屬性。 – marcellscarlett

回答

3

試試這個:

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember] 
public DateTime?   Registered   { get; private set; } 

問號使得財產可空

+0

我試過你的解決方案,但它似乎並不像它的工作,但它應該。每當我生成一個遷移腳本時,該字段在腳本中被標記爲「nullable:false」。即使在數據庫創建。什麼可能是錯的?私人設置? – Atrotygma

2

該技術表現得像是持久化到數據庫中的一個readonly字段。一旦設置了值,就不能(很容易)通過使用代碼進行更改。 (當然,如果需要,可以將setter更改爲publicinternal)。

當您創建使用此代碼的類的新實例Registered最初不會被設置。第一次請求Registered的值時,它會看到它沒有被分配一個,然後默認爲DateTime.Now。如果需要,您可以將其更改爲DateTime.UTCNow

當從數據庫中提取一個或多個實體時,實體框架將設置Registered的值,包括private這樣的設置器。

private DateTime? registered; 
[Required] 
public DateTime Registered 
{ 
    get 
    { 
     if (registered == null) 
     { 
      registered = DateTime.Now; 
     } 
     return registered.Value; 
    } 
    private set { registered = value; } 
}