将 CrmSdk.CoreAssemblies v9 与 Dynamics CRM 2013 结合使用 - 并发行为序列化

问题描述 投票:0回答:1

我维护一个需要向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?

dynamics-crm dynamics-crm-2013 dynamics-crm-365
1个回答
0
投票

创建一个实现

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

© www.soinside.com 2019 - 2024. All rights reserved.