16

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

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(对于 Create 消息)或 Changed(对于 Update 消息)

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

我试过

_policy.EntityState = EntityState.Changed

但后来我收到一条消息说

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

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

4

5 回答 5

21

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

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

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

于 2011-05-31T13:54:47.600 回答
11

为了避免这个问题,您可以简单地使用 update-helper-objects 而不是使用检索到的记录:

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

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

于 2014-08-07T13:38:27.463 回答
10

我有同样的问题。我从使用切换

context.Update(object) 

context.UpdateObject(object) 

它奏效了。

于 2011-12-28T17:04:29.167 回答
2

这对我有用:

recordToUpdate.EntityState = EntityState.Changed;

(recordToUpdate 是要更新的实体)

于 2013-09-24T05:45:11.087 回答
1

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

是时候复习我的 linq 了!

于 2011-06-01T08:26:56.720 回答