我正在编写一个 .NET 应用程序,在其中连接到 Dynamics 并尝试更新记录。我正在使用
Simple.OData.Client
软件包 v6.0.1(repo here)。我有一个模型,其中有一个查找属性,我想将其与模型的其他属性一起更新。这是我的课程:
public class UpdateRequest
{
[JsonProperty("msdyn_systemstatus")]
public required Status Status { get; set; }
[JsonProperty("msdyn_substatus")]
public required Substatus Substatus { get; set; }
//more properties
}
Status 是一个枚举(选择),Substatus 是一个查找字段,具有以下类定义:
[DataContract(Name = "msdyn_itemsubstatus")]
public class Substatus
{
[JsonProperty("msdyn_substatusid")]
public Guid? Id { get; set; }
[JsonProperty("msdyn_name")]
public string? Name { get; set; }
}
我的更新代码很简单:
IODataClient _odataClient; //injected in constructor
var result = await _odataClient.For<Item>()
.Key(id)
.Set(updateRequest) // Status and Substatus.Id are filled, Substatus.Name is null
.UpdateEntryAsync(true);
记录请求时,我看到创建了以下内容:
{
"@odata.type": "#Microsoft.Dynamics.CRM.msdyn_parententity",
"msdyn_systemstatus": 690970000,
"[email protected]": "{dynamicsbaseurl}/msdyn_itemsubstatus(insertguid)"
}
msdyn_substatus 属性中生成的 url 引用相关实体的单数形式,因此更新失败。当通过邮递员以复数形式执行相同的更新请求时,它可以工作。
我已经做了相当多的研究,但还没有找到任何关于如何影响所使用的集合名称的代码示例,而且似乎也无法确定它在库中的哪个位置完成。如果您能帮助理解序列化的工作原理和影响(也许是某种属性?),我们将不胜感激。
dataverse Web API 使用“集合名称”来寻址实体。您可以从maker studio 或使用Web api 本身获取表/实体的名称。请参阅https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/web-api-samples。
也就是说,如果您使用.net,您可能需要考虑使用 dataverse 服务客户端,它提供 IOrganizationService 接口来与 datavers 进行通信。它还可以与 pac modelbuilder 一起构建强类型,允许您为表、自定义 api 等创建类型。 https://github.com/microsoft/PowerPlatform-DataverseServiceClient