如何在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
相关产品推荐
相关产品推荐

