使用EntityFramework Update PK時跳出錯誤訊息如下:
屬性 'ColumnName' 是此物件之索引鍵資訊的一部分,而且無法修改。
最近在開發的時候碰到一個問題,
客戶提供了一個Table:Product,這個Table裡面有兩個PK
一個是ID,一個是state,
我希望資料被一開始被新增的時候STATE是A,當筆資料要被刪除的時候不要真的刪除,
而是將state 設為D,
但是我真正要刪除的時候去更新欄位STATE 會跳出以下的錯誤訊息:
"屬性 'STATE' 是此物件之索引鍵資訊的一部分,而且無法修改。"
我處理方式只針對STATE這個欄位做處理
var query = (from pro in db.Product.AsQuerable()
where pro.ID="要刪除的ID"
select pro).FirstOrDefault();
if(query!=null)
{
query.STATE = "D";
}
try{db.SaveChanges();}
catch(Exception ex){}
有下中斷點去看,query是有資料,在db.SaveChanges()之前,STATE也改為D了,
但是只要 db.SaveChanges()就出錯
我在網路上找了一下這個錯誤訊息,似乎都是跟我要更新的欄位被別的Table設為FK造成,
但是我這個State 應該是沒有被用,我用.edmx沒有看到關聯的線,
用SQL語法 EXEC sp_fkeys 'Product' 也沒有看到東西
如果我直接在SQL Server Management Studio裡面下Update語法是可以成功更新STATE的值
關於這個問題,可參考:
https://stackoverflow.com/questions/29675081/how-to-update-primary-key-from-entity-framework
裡面有提到 update pk 在 EF 是不允許的
所以替代方式有兩種
1. 先刪舊資料,再新增一筆STATE="D"的一模一樣資料
2. 用stored procedure (EF也能用sp)
後來測試之後確定先刪除再新增是可行的,只是想想這個做法很蠢
應該還是要跟客戶溝通一下Table Schema要修正才對