2011-05-31 51 views
16

我正在使用以下代碼更新實體。「嘗試更新CRM 2011中的實體時,必須將EntityState設置爲空,創建(用於創建消息)或更改(用於更新消息)」

Service.Update(_policy); 

其中的政策是使用CrmSvcUtil.exe

public partial class new_policy : Microsoft.Xrm.Sdk.Entity, System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged 

我檢索使用LINQ的政策所產生的一類,然後更新一個屬性(爲EntityReference),然後嘗試更新

當這代碼運行我收到以下錯誤消息:

必須將EntityState設置爲空,創建(對於C reate message)或 已更改(用於更新消息)

還有其他實體以我可以更新的相同方式生成。

我試圖

_policy.EntityState = EntityState.Changed 

但後來我得到一個消息說

實體是隻讀和「EntityState」屬性不能 修改。改用上下文來更新實體。

有誰知道這是什麼原因造成的?

回答

1

原來這是與被檢索實體首先我LINQ查詢的問題。當我用查詢表達式替換它時,它工作正常。

時間來刷我的linq!

+1

我也想使用LINQ,甚至將我現有的QueryExpressions切換到它,只是爲了找出它不起作用。這篇文章是我迄今發現的唯一解釋,說明通過LINQ檢索實體,然後更新它是不允許的設計。 LINQ僅用於查詢。 http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/682a7be2-1c07-497e-8f58-cea55c298062/ – roadsunknown 2012-02-20 19:24:47

+1

只是一個友好的建議,小心使用LINQ,似乎查詢被執行每次當你使用你正在提取的對象時,如果你不小心,不要將它存儲在內存中。 (necroposting豪華,但它可能有助於某人) – 2016-06-09 10:47:42

9

我有同樣的問題。我使用

context.Update(object) 

切換到

context.UpdateObject(object) 

和它的工作。

+6

我認爲你的意思是你從使用service.Update(object)切換到context.UpdateObject(object) – 2012-01-25 21:53:14

+0

爲我工作!謝謝KClough! – 2012-08-20 15:53:12

+0

TimPartridge:在CRM 2011中,上下文也有一個'Update'方法 – jpaugh 2017-03-27 16:47:52

2

這爲我工作:

recordToUpdate.EntityState = EntityState.Changed; 

(recordToUpdate要更新的實體)

+1

EntityState是隻讀的(可能在2013年是新的)。您應該使用上下文來更新狀態。 – Ryan 2015-02-09 05:08:03

8

爲避免你可以簡單地使用更新輔助對象,而不是使用檢索記錄的問題:

var policyUpdater = new Policy { Id = _policy.Id, FieldToUpdate = "newValue" }; 
service.Update(policyUpdater); 

注意:未設置update-helper-object的屬性將被忽略。更新不會將相應的記錄字段設置爲空

+0

這很好。謝謝! – mgrowan 2015-08-21 02:41:02

+0

謝謝,今天這對我有幫助! – Dyrborg 2015-09-23 15:35:46

+0

不錯,簡潔。 – DeveloperM 2015-10-15 20:25:10