使用实体框架更新CRM中的实体记录



我最近一直在尝试使用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();

但是在保存changes之后,所做的所有更改都被忽略了,我注意到更改后的记录的实体状态仍然没有改变。

当使用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方法的实现,以返回名称"ConcurrencyBehavior"和命名空间"的非null值http://schemas.microsoft.com/xrm/7.1/Contracts"。"。有关详细信息,请参阅InnerException。

或者这个

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

当试图手动将实体状态设置为更改时,我得到了这个错误

实体是只读的,无法修改"EntityState"属性。请改用上下文更新实体。

知道我可以使用ctx.AddObject() 使用相同的自动生成代码创建新记录

您应该在调用ctx.SaveChanges()之前使用ctx.UpdateObject

UpdateRequest.ConcurrencyBehavior在CRM 2015更新1中引入。在我看来,CRM的版本和您正在使用的CrmSvcUtil的版本不匹配。您必须使用更新版本的SDK工具。

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

最新更新