剛好維護一個專案,一直跳出SQL Insert的錯誤訊息,問了同事才知道有這個東西,大夢初醒,趕快來記錄一下。
再規劃SQL時,一定會有主索引Key 欄位,也常常會有一個欄位叫"建立時間"。
KEY 值識別規格當然會選擇自動變量
建立時間,通常都會直接給預設值getdate(),這樣程式就不用在對這個欄位寫等於DateTime.Now 了
但是MVC使用資料部分用entityFramework 開發,所有欄位都要給值,且連SQL有設定預設值的欄位都會無效不能略過,哪不就等於如同虛設預設值了。
但我碰到的問題是,日期欄位一值跳出不可以給NULL的錯誤訊息,但我程式真的有insert DateTime.Now值給那個欄位,一直搞不定,會不會鬼檔牆了。
一問之下~才知道,開發此專案的工程師,塞了一個Attribute在這個欄位上,導致這個欄位不接受程式給的值,而該名工程是又忘記給該欄位預設值,造成這個欄位不接受外面插入值,而自己也沒有值可用,一直出現不能為NULL的BUG ! Orz~~
就是這個 ^0^
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedOn { get; set; }
馬上去msdn 查DatabaseGeneratedOption發現他有三個屬性
Computed 就是限定該欄位會使用SQL裡的預設值,就絕對不會接受外給的值 (我鬼打牆點.....
Identity 就是KEY值自動編號,也不接受外來的值,可以保護KEY值
這樣我之前的疑惑也都解開了,我都有設預設值了,為何還要對這個欄位寫程式,原來是我沒有加這個Attribute!