使用Entity Framework更新CRM中的实体记录

时间:2015-11-22 08:42:47

标签: dynamics-crm crm dynamics-crm-2015

我最近一直在尝试使用CRM CrmSvcUtil.exe SDK工具中的自动生成代码来更新CRM 2015实体中的记录 使用代码

CrmConnection con = new CrmConnection("CRM");
XrmServiceContext ctx = new XrmServiceContext(con);
var nn = ctx.TestEntity.Where(x => x.Name== "12132").FirstOrDefault();
nn.Name="test";
ctx.SaveChanges();

但保存更改后忽略所有完成的更改,我注意到更改记录的实体状态仍未更改。

使用ctx.UpdateObject(nn);ctx.Update(mm);时,应用程序会抛出以下错误:

  

格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://schemas.microsoft.com/xrm/2011/Contracts/Services:request时出错。 InnerException消息在第1行位置13371中为“错误”。元素' http://schemas.datacontract.org/2004/07/System.Collections.Generic:value'包含映射到名称' http://schemas.microsoft.com/xrm/7.1/Contracts:ConcurrencyBehavior'的类型的数据。反序列化器不知道映射到此名称的任何类型。考虑更改DataContractResolver上的ResolveName方法的实现,以返回name' ConcurrencyBehavior'的非空值。和命名空间' http://schemas.microsoft.com/xrm/7.1/Contracts'。'。有关详细信息,请参阅InnerException。

或者

  

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

当尝试手动将实体状态设置为已更改时,我收到此错误

  

该实体是只读的,并且实体状态为'财产不能修改。请使用上下文来更新实体。

知道我可以使用ctx.AddObject()

使用相同的自动生成代码创建新记录

1 个答案:

答案 0 :(得分:2)

在致电ctx.UpdateObject之前,您应该使用ctx.SaveChanges()

CRM 2015 Update 1中引入了{p> UpdateRequest.ConcurrencyBehavior。在我看来,您的CRM版本与您正在使用的CrmSvcUtil版本不匹配。您必须使用较新版本的SDK工具。

由于您使用的是RTM版本的CRM,因此您可以下载并使用CRM 2015 SDK core tools (version 7.0.1)的相应RTM版本。使用该版本的CrmSvcUtil重新生成上下文后,您不应再看到与UpdateRequest.ConcurrencyBehavior相关的任何错误。