我最近一直在尝试使用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()
答案 0 :(得分:2)
在致电ctx.UpdateObject
之前,您应该使用ctx.SaveChanges()
。
UpdateRequest.ConcurrencyBehavior
。在我看来,您的CRM版本与您正在使用的CrmSvcUtil版本不匹配。您必须使用较新版本的SDK工具。
由于您使用的是RTM版本的CRM,因此您可以下载并使用CRM 2015 SDK core tools (version 7.0.1)的相应RTM版本。使用该版本的CrmSvcUtil重新生成上下文后,您不应再看到与UpdateRequest.ConcurrencyBehavior
相关的任何错误。