我维护一个需要向CRM2013读取/写入数据的API,到目前为止我一直在使用CrmSdk版本6.1.2。然而,最近需要调整 API 以与使用 CRM365 的组织一起工作,这需要 CrmSdk 更高版本的功能,因此我必须更新软件包。
现在,当我尝试通过 OrganizationServiceContext 将更改保存到 CRM2013 时,我收到错误“格式化程序在尝试反序列化消息时引发异常: '第 1 行位置 3352 中出现错误。元素 'http://schemas.datacontract.org/2004/07/System.Collections.Generic:value' 包含映射到名称 'http://schemas.microsoft 的类型的数据.com/xrm/7.1/Contracts:ConcurrencyBehavior'。解串器不知道映射到该名称的任何类型。考虑更改 DataContractResolver 上 ResolveName 方法的实现,以返回名称“ConcurrencyBehavior”和命名空间“http://schemas.microsoft.com/xrm/7.1/Contracts”的非空值。”。”
更新 CrmSdk 版本后,在我的代码没有进行任何其他更改的情况下,此错误开始发生。有什么解决方法吗?或者是否有某个版本的 CrmSdk 同时适用于 CRM365 和 CRM2013?
创建一个实现
IOrganizationService
接口的自定义类。这个类在其构造函数中注入了一个原始的 IOrganizationService
实例,例如一个 ServiceClient
物体。
新的
OrganizationService
类实现了该接口并简单地重定向所有请求的调用。只有 Update
和 Delete
消息需要特殊处理:对于这些消息,必须从请求中删除 ConcurrencyBehavior
参数。
class OrganizationService : IOrganizationService
{
private readonly IOrganizationService organizationService;
public OrganizationService(IOrganizationService organizationService)
{
this.organizationService = organizationService;
}
public OrganizationResponse Execute(OrganizationRequest request)
{
if (request is UpdateRequest || request is DeleteRequest)
{
return organizationService.Execute(new OrganizationRequest(request.RequestName)
{
["Target"] = request["Target"]
});
}
return organizationService.Execute(request);
}
(...)
}
创建一个
OrganizationServiceContext
,如下所示:
var context = new OrganizationServiceContext(new OrganizationService(serviceClient));
另请参阅乐观并发 - MS Learn。