使用 Entity Framework 更新 PK 的錯誤

  • 2734
  • 0

使用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要修正才對