亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用實體框架更新主鍵值

使用實體框架更新主鍵值

森林海 2019-12-04 15:29:41
我正在嘗試從實體框架中更新復合主鍵的一個值,并且收到此錯誤:“屬性'CustomerID'是對象鍵信息的一部分,無法修改。”這是我的代碼:Dim customer As Customer = (From c In db.Customer Where c.CustomerID = "xxx" AndAlso c.SiteKey = siteKey).FirstOrDefaultcustomer.CustomerID = "fasdfasdf"db.SaveChanges()似乎太簡單了。您無法在實體框架內更新主鍵,這是真的嗎?我找不到有關該主題的任何文檔。謝謝!
查看完整描述

3 回答

?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

您不能并且有充分的理由。請參閱KM評論。


我說您可以做的一件事是有兩個表,其中一個表包含匿名數據,另一個表在真實用戶登錄后存儲真實用戶數據。


或者您可以(未經測試或由我完成)具有這種表布局:


---Customers----

AutoNumber PK <- This links to all other tables in your database, and does NOT change.

CustomerID  <- This can change.

CustomerType <- Anonymous or logged in.  

當他們登錄時,將CustomerType和CustomerID更改為所需的名稱。


因此,您的查詢可能如下所示:


Dim customer As Customer = (From c In db.Customer _

                            Where c.CustomerID = {Some temp ID} _

                            AndAlso c. CustomerType = "Anonymous").FirstOrDefault

// After user logs in.

customer.CustomerID = {Make a new user ID here}

customer.CustomerType = "LoggedIn" {or what ever}

db.SaveChanges()

請注意,自動編號主鍵永遠不會更改。這樣一來,您與客戶表有關系的任何表仍然可以使用,而不必對主鍵進行級聯更新(這就像用鉛筆刺中眼睛一樣)。


查看完整回答
反對 回復 2019-12-04
?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

如果在任何時候都可能只有一個數據庫上下文實例,那么修改pk不會是一個問題。但是每個上下文實例都維護自己的緩存,并且可以緩存要修改的記錄。

EF與數據庫的交互使用pk(來自上下文緩存)來標識它們正在查詢的記錄。如果上下文對象可以更新持久性密鑰,則其他上下文對象用來標識該記錄的信息將立即且永久錯誤。

簡而言之,如果更新主鍵,則可能在上下文的所有其他實例中使緩存無效,這將從根本上破壞EF。這是更新pk不好的主要原因之一。


查看完整回答
反對 回復 2019-12-04
  • 3 回答
  • 0 關注
  • 687 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號