2016年4月25日 星期一

EF(Entity Framework)在執行存檔時發生的錯誤

今天在重構某一個功能時發生一個怪事,花了一些時間才找到實際發生的原因,在這邊紀錄一下免得下次發生又要再查一次。

事情是這樣的,我的功能是有一個付款的Table,另外有幾個不同付款來源的Table,這些Table裡都有另外註記一些付款資訊,Table之間有建立關聯,EF也有將關聯拉進來,本來在測試付完款的資料,因一些原因必須回復當時做完付款註記到各來源的Table資料表,這時在ObjectContext.SaveChange()發生錯誤,

錯誤訊息:對資料庫的變更認可成功,但是在更新物件內容時發生錯誤。ObjectContext 可能處於不一致的狀態。內部例外狀況訊息: 發生參考完整性限制式違規: 定義參考條件約束的屬性值在關聯性中的主體物件和相依物件之間不一致。

跳出的錯誤訊息有點看不懂他想表達的意思是甚麼,那這訊息老實說也不是第一次看到了,只是之前遇到的時候趕時間就直接用SQLCommand改寫那個段落, 今天想說一直這樣也不是好辦法,決定來追一下這訊息到底是發生甚麼事了。
 
查了半天終於發現問題點,我簡單敘述一下,我的付款Table裡有一個ID,其它付款來源的Table也有一個付款Table的ID,兩個是有作關連的,今天我把付款來源的Table的付款ID更新為null(因為取消付款),那付款的Table並沒有把這筆作刪除,原因就是這個付款ID,被EF偵測到有關連性但是他在寫回資料庫時判斷關聯資料是有異常的,但實際上直接下SQL是可以被允許的,我個人認為是EF為了確保資料正確性而不允許這樣的動作。

後來我把付款Table的那筆資料在同一個ObjectContent裡一起執行就可以順利更新了。

以後只要有遇到此錯誤訊息,第一件事就是先去查看執行的程序裡有運用到那些Table並且關聯為何,過程是否有不正常寫入資料。

沒有留言 :

張貼留言