2010-08-31 86 views
3

我在Linq to SQL模型中有一個Client實體和PostCode實體。數據庫中的Clients表包含client_postcode列,該列是用於郵政編碼PostCode表中的列的FK列,該表是PostCode表的varchar列主鍵。Linq to SQL替換相關實體

當更新客戶端,在我的代碼我這樣做

 // postcode 
     updating.PostCode = (from p in ctx.PostCodes 
          where p.postalcode.Equals(client.PostCode.postalcode) 
          select p).First(); 

,其中從ASP.NET MVC視圖形式提供client對象。此代碼似乎設置PostCode相關的實體罰款。但是在調用SubmitChanges()時,我收到以下異常:

已更改類型爲'PostCode'的對象的成員'postalcode'的值。定義對象身份的成員不能更改。考慮添加一個具有新身份的新對象,並刪除現有的對象。

所以我目前無法更改相關實體。 Linq to Sql是如何完成的?

UPDATE:

經過進一步的審查和排除故障,我發現,問題出在ASP.NET MVC的UpdateModel()調用。如果我調用UpdateModel()以用編輯的數據更新現有實體,則PostCode的FK分配有問題。如果我不調用UpdateModel並手動完成,它就會起作用。 任何想法在UpdateModel()中出現錯誤,它無法正確設置與外鍵實體的關係?

我正在更新此問題並開始賞金。這個問題被簡化了。如何在ASP.NET MVC Edit視圖中更新項目(相關實體爲FK)時成功使用L2S和UpdateModel()

+0

你確定你根本沒有改變PostCode對象嗎?您可以在調用SubmitChanges()方法之前發佈您調用的代碼嗎? – willvv 2010-08-31 17:50:54

+0

這是我對PostCode相關實體所做的一切。 – mare 2010-08-31 19:10:41

回答

2

在我看來,你正在收到PostCode.postalcode在http post請求。基於模型如何結合工程,的UpdateModel呼叫更新模型的.PostCode.postalcode要傳遞到它

使用this overload來包括或排除特定屬性

+0

這是迄今爲止最接近的答案,儘管我還不能確認它。 Upvoting。 – mare 2010-09-09 09:23:53

+0

感謝eglasius。這對我也很有用。神奇的解決方案。正是我所需要的。在我的情況下,ORM試圖強行插入一個名爲「StatusID」的新複雜子對象,即使我根本沒有更新狀態,Status也沒有包含在我的表單/視圖中。所以我只是調用過載如:UpdateModel(ExistingRecord,String.Empty,null,new string [] {「StatusID」});它的作品!!!!!謝謝 – Aaron 2011-01-07 05:10:52

0

會不會updating.client_postcode = client.client_postcode;完成你想要的?

Client.PostCode應根據client_postocde查找。

+0

如果我這樣做,它說:由於對象的當前狀態,操作無效。說明:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。異常詳細信息:System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException:由於對象的當前狀態,操作無效。 – mare 2010-08-31 19:15:09

0

你不能做你正在嘗試的,你不能改變這樣的Postcode

詹姆斯的想法是在正確的方向。

Updatemodel()需要從Formcollection

如何將這些值都在Formcollection匹配值?他們有什麼keys

基本上有兩種編輯對象的方法。

選項1:

所有值名稱要更新必須在Formcollection,這讓您只需撥打對象的UpdateModel()相應的鍵。不要SubmitChanges()

選項2:

獲取原始對象,改變它手動的值(因爲該鍵不對應),並做SubmitChanges()

你綁到更改鏈接,你不能做到這一點。你只能編輯在這種情況下是字符串的updates.client_postcode?

您能否在這裏複製整個動作?所以我可以在不賭博的情況下爲你寫一些代碼。

+0

我只用UpdateModel()(在這種情況下,我得到了我的問題中提到的異常),並且沒有它並手動設置原始對象的屬性(在這種情況下,存在我提供的異常對詹姆斯的回答發表評論)。 – mare 2010-09-06 09:34:43

+0

另外你說的是錯的,你可以也應該改變相關的實體,通過改變關聯屬性而不是FK本身,看這裏http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/ 744b2c6a-ecb8-44bf-b72a-dc1b85b34342/ – mare 2010-09-06 09:41:25

+0

你可以只發布整個操作方法嗎?因爲顯然有些事情是錯誤的......並且它沒有顯示在你提供的代碼中。 – Stefanvds 2010-09-06 09:49:44