Dynamics crm 2011 &引用;EntityState必须设置为null、Created(用于创建消息)或Changed(用于更新消息)";尝试在CRM 2011中更新实体时

Dynamics crm 2011 &引用;EntityState必须设置为null、Created(用于创建消息)或Changed(用于更新消息)";尝试在CRM 2011中更新实体时,dynamics-crm-2011,Dynamics Crm 2011,我正在使用以下代码更新实体 Service.Update(_policy); 其中policy是使用CrmSvcUtil.exe生成的类 public partial class new_policy : Microsoft.Xrm.Sdk.Entity, System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged 我使用LINQ检索策略,然后更新一个属性(Entity

我正在使用以下代码更新实体

Service.Update(_policy);
其中policy是使用CrmSvcUtil.exe生成的类

public partial class new_policy : Microsoft.Xrm.Sdk.Entity, System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged
我使用LINQ检索策略,然后更新一个属性(EntityReference),然后尝试更新

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

EntityState必须设置为null、Created(用于创建消息)或 已更改(用于更新消息)

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

我试过了

_policy.EntityState = EntityState.Changed
但后来我收到一条信息说

该实体是只读的,“EntityState”属性不能为空 被改进的。改为使用上下文更新实体


有人知道这是什么原因吗?

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

您应该添加crmContext.UpdateObject(联系人);在crmContext.SaveChanges()之前


另请参见

原来,首先检索实体的是我的linq查询问题。当我用查询表达式替换它时,它工作正常


是时候复习一下我的linq了

我也有同样的问题。我不再使用了

context.Update(object) 

它成功了

这对我很有用:

recordToUpdate.EntityState = EntityState.Changed;

(recordToUpdate是要更新的实体)

为了避免此问题,您可以简单地使用update helper对象,而不是使用检索到的记录:

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

注意:未设置的update helper对象的属性将被忽略。更新不会将相应的记录字段设置为空

我想你的意思是你从使用service.update(对象)切换到了context.UpdateObject(对象)为我工作!谢谢你!TimPartridge:在CRM 2011中,上下文也有一个
更新
方法。我也想使用LINQ,甚至将现有的QueryExpression切换到它,结果发现它不起作用。这篇文章是到目前为止我发现的唯一一个解释,它说通过LINQ检索实体然后更新它是设计不允许的。LINQ仅用于查询。只是一个友好的建议,小心使用LINQ,似乎每次使用要获取的对象时都会执行查询,如果不小心,则不会将其存储在内存中。(但可能会有帮助)EntityState是只读的(可能在2013年是新的)。你应该使用上下文来更新状态。谢谢你,这对我今天很有帮助!这里的最佳答案很简单,因为1)它非常简单,2)它不假设查询只针对相关列(否则您将重新提交未更改的列,如果您试图读取审核历史记录,将导致噩梦)。
var policyUpdater = new Policy { Id = _policy.Id, FieldToUpdate = "newValue" };
service.Update(policyUpdater);