"尝试更新CRM 2011中的实体时,必须将EntityState设置为null,Created(对于Create消息)或Changed(对于Update message)"

Nei*_*eil 16 dynamics-crm-2011

我使用以下代码更新实体.

Service.Update(_policy);
Run Code Online (Sandbox Code Playgroud)

其中policy是使用CrmSvcUtil.exe生成的类

public partial class new_policy : Microsoft.Xrm.Sdk.Entity, System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged
Run Code Online (Sandbox Code Playgroud)

我使用LINQ检索策略,然后更新一个属性(EntityReference),然后尝试更新

当此代码运行时,我收到以下错误消息:

EntityState必须设置为null,Created(用于创建消息)或Changed(用于更新消息)

还有其他实体以我可以更新的相同方式生成.

我试过了

_policy.EntityState = EntityState.Changed
Run Code Online (Sandbox Code Playgroud)

但后来我收到一条消息说

该实体是只读的,并且不能修改"EntityState"属性.请使用上下文来更新实体.

有谁知道是什么原因造成的?

cce*_*lar 20

您必须告诉您crmContext(使用适当的名称)如何处理更改.

你应该添加crmContext.UpdateObject(contact); 在crmContext.SaveChanges()之前;

另请参阅如何使用插件中的LINQ更新CRM 2011实体?


KCl*_*ugh 10

我有同样的问题.我改用了

context.Update(object) 
Run Code Online (Sandbox Code Playgroud)

context.UpdateObject(object) 
Run Code Online (Sandbox Code Playgroud)

它起作用了.

  • 我认为你的意思是你从使用service.Update(object)切换到context.UpdateObject(object) (6认同)

use*_*754 8

要避免此问题,您只需使用update-helper-objects而不是使用检索到的记录:

var policyUpdater = new Policy { Id = _policy.Id, FieldToUpdate = "newValue" };
service.Update(policyUpdater);
Run Code Online (Sandbox Code Playgroud)

注意:将忽略未设置的update-helper-object的属性.更新不会将相应的记录字段设置为null