You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# Azure Function中更新Dynamics的EmployeeV2实体?

如何在C#中对Dynamics的EmployeeV2实体执行PATCH更新

问题背景

在Azure Function中尝试更新Dynamics的EmployeeV2实体,最初使用POST请求(无论是不带主键的集合路径还是带单个主键的实体路径)均返回internal server error;在Postman中使用PATCH请求时,仅指定PersonnelNumber的URI返回“找不到资源”的错误。

核心问题分析

  • 请求方法错误:POST用于创建新实体,更新现有实体必须使用PATCH方法。
  • 实体定位错误:EmployeeV2是复合主键实体,主键由PersonnelNumber和EmploymentLegalEntityId共同组成,仅指定其中一个值无法定位到唯一实体,导致URI匹配失败。
  • 可能的字段值问题:请求体中的TitleId带有前置空格,需确认Dynamics系统中对应的TitleId是否存在该空格,无效值也可能引发服务器错误。

正确的C# PATCH实现步骤

  • 构造正确的实体定位URI:同时指定复合主键的两个值,格式为:
    /data/EmployeesV2(PersonnelNumber='{人员编号}',EmploymentLegalEntityId='{法人实体ID}')
    
  • 使用HTTP PATCH方法:替换原有的PostAsync为PatchAsync(.NET Core 2.1+默认支持)。
  • 精简请求体:仅传入需要更新的字段,无需包含所有实体字段。
  • 确保HttpClient已完成Dynamics认证:需配置OAuth2令牌,否则会因权限问题返回服务器错误。

完整C#代码示例

public async Task UpdateEmployeeAsync(JObject employee)
{
    // 从传入的JObject中获取复合主键值
    var personnelNumber = employee["PersonnelNumber"].ToString();
    var legalEntityId = employee["EmploymentLegalEntityId"].ToString();
    
    // 构造正确的实体URI
    var entityUri = $"/data/EmployeesV2(PersonnelNumber='{personnelNumber}',EmploymentLegalEntityId='{legalEntityId}')";
    
    // 仅保留需要更新的字段(可选,减少数据传输)
    var updateContent = new JObject
    {
        ["FirstName"] = employee["FirstName"],
        ["LastName"] = employee["LastName"],
        ["PrimaryContactEmail"] = employee["PrimaryContactEmail"],
        ["EmploymentStartDate"] = employee["EmploymentStartDate"],
        ["TitleId"] = employee["TitleId"].ToString().Trim() // 去除TitleId的多余空格
    };
    
    var content = new StringContent(updateContent.ToString(), Encoding.UTF8, "application/json");
    
    // 发送PATCH请求
    var response = await _httpClient.PatchAsync(entityUri, content);
    response.EnsureSuccessStatusCode();
}

额外注意事项

  • 若使用.NET Framework,HttpClient默认没有PatchAsync方法,需手动扩展或使用SendAsync方法指定HttpMethod.Patch:
    var request = new HttpRequestMessage(new HttpMethod("PATCH"), entityUri)
    {
        Content = content
    };
    var response = await _httpClient.SendAsync(request);
    
  • 确认Dynamics Web API的版本兼容性,确保路径中包含正确的API版本(如/api/data/v9.2/),若未指定版本也可能导致路由错误。

内容的提问来源于stack exchange,提问作者Alex Gordon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:34:52