2010年9月9日 星期四

MVC專案中常見的Entity Framework 資料庫欄位型態設定錯誤(column type error)與更正方式

休士頓!我們發生問題了!

當我們在MVC專案中,已經設定好了Entity Framework,也寫好了MVC程式,執行Compile整個專案,結果我們發現VS 2010告訴我們出了一點錯誤,如下圖,初步看來,是資料庫的Log這個Table的RecordID這個Int且是自動編號的欄位,我們卻設成String型態了,所以資料無法新增到Log這個Table中。


檢查資料庫Schema

檢查問題的第一步驟,我們當然回到資料的源頭資料庫中去檢查是否Log這個Table的RecordID這個欄位資料型態是否正確,結果如下圖,是正確的,RecordID這個欄位的資料型態是我們所需要的Int且是自動編號。所以問題應該是出在MVC專案中的某一個設定給設錯了。


重新更新資料庫Schema到Entity Framework設定

通常我們會打開MVC專案,點選Entity Framework程式(*.edmx),並且再次執行更新資料庫Schema的設定,讓MVC專案中的RecordID這個欄位和資料庫保持同步。如下圖在Model Browser視窗中按下淺橘色的功能列進行同步DB Schema。


很不幸,我們認為已經修正問題了,開始執行Compile整個專案,天啊,還是出現同樣的錯,又回到原點了。

問題在這裡

結果,檢查了半天,原來是因為第一次建立Entity Framework的時候,RecordID這個欄位資料型態我們在資料庫設成字元(char)型態,這是錯的,我們改正資料庫這個欄位型態後,並也回到MVC專案中去將Entity Framework與資料庫進行同步,但是並沒有真正的將錯誤的資料型態改正,因為我們下列這個地方沒有改到,就是Entity Framework Schema關聯圖中,Log這個Table的RecordID這個欄位資料型態,VS開發環境並沒有因為同步更新資料庫的動作而去修正為正確的Int且是自動編號,還是錯誤的。


「手動」調整資料欄位型態

我們還需要「手動」打開Log這個Table的RecordID這個欄位的屬性設定視窗,「手動」將資料型態改正為Int32(相對應資料庫為Int資料型態)。


修改完畢後,我們執行Compile整個專案,這時可發現這個錯誤已經被修正了。這有點被VS 開發環境給誤導了,導致誤以為Schema已經與資料庫同步了,其實Entity Framework同步資料庫看來除非我們把Entity Framework Schema關聯圖中的Log 這個Table給完全刪除,重新執行同步資料庫一次並勾選Log 這個Table。不然我們就需要用上述的「手動」的去修正在Entity Framework 資料欄位型態。

沒有留言:

張貼留言