MVC 事件紀錄簿(一) 之 SQL給預設值會失效或Insert無效原因

剛好維護一個專案,一直跳出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!

 

MSDN參考 http://msdn.microsoft.com/zh-tw/library/system.componentmodel.dataannotations.schema.databasegeneratedoption(v=vs.110).aspx