2012-04-18 36 views
4

我真的很撓我的頭。我正在嘗試使用Dynamics CRM SDK來更新帳戶記錄。無論我嘗試什麼,都失敗了。開始。動態CRM保存實體更改 - 獲取錯誤

Account sampleAccount = CrmAccount.GetAccountsBySubmissionCode(crmService, "ERZZUP").Single<Account>(); 
sampleAccount.Name = "AMC Edited"; 
crmService.Update(sampleAccount); 

給出了錯誤:EntityState必須設置爲null,創建日期(用於創建消息)或更改(更新消息)

XrmServiceContext ctx = new XrmServiceContext(crmService); 
Account sampleAccount = CrmAccount.GetAccountsBySubmissionCode(crmService, "ERZZUP").Single<Account>(); 
sampleAccount.Name = "AMC Edited"; 
ctx.UpdateObject(sampleAccount); 
ctx.SaveChanges(); 

給出了錯誤:的背景是當前不跟蹤「帳戶」實體。

XrmServiceContext ctx = new XrmServiceContext(crmService); 
Account sampleAccount = CrmAccount.GetAccountsBySubmissionCode(crmService, "ERZZUP").Single<Account>(); 
sampleAccount.Name = "AMC Edited"; 
ctx.Attach(sampleAccount); 
ctx.UpdateObject(sampleAccount); 
ctx.SaveChanges(); 

給出了錯誤:的「帳戶」實體已附加到上下文。

作爲參考, 1.帳戶目的是通過早期綁定代碼生成工具 2. crmService的SDK創建是IOrganizationService連接對象 3. GetAccounts ...執行LINQ查詢並返回一個IEnumerable

請幫忙。感謝, 克里斯。

回答

4

請參閱http://msdn.microsoft.com/en-us/library/gg695783.aspx,特別是「多數據上下文」部分。看起來你正在使用多個上下文來跟蹤實體。 CrmAccount.GetAccountsBySubmissionCode方法只是隱藏你的這一點。

CrmAccount.GetAccountsBySubmissionCode方法中確保處置上下文/服務的返回IEnumerable<Account>之前,或請確保您使用相同的上下文/服務Update

+0

你說得對,在GetAccounts ....方法中存在上下文。但是,我現在在返回IEnumerable之前在上下文中調用Dispose(),並且仍然出現錯誤。 – 2012-04-18 19:38:06

+0

好的。玩得更多,移動LINQ修復它。我將重構我的方法以傳遞現有的上下文以供使用。感謝您的指示,這真的很有幫助。 – 2012-04-18 19:48:30

+2

處理上下文的更健壯的方式是使用'使用(var context = new XrmServiceContext()){// code}'塊。在using塊之前聲明IEnumerable ,在using塊中分配結果並返回結果。 – 2012-04-18 19:53:05