Odata 如果实体是全新/临时的,如何将其发送到全局操作输入参数?

Odata 如果实体是全新/临时的,如何将其发送到全局操作输入参数?,odata,dynamics-crm,microsoft-dynamics,dynamics-crm-2016,Odata,Dynamics Crm,Microsoft Dynamics,Dynamics Crm 2016,我相信这个问题与这里链接的问题不同: 我有一个全局操作,它接受ClubOfficer实体作为必需的输入参数。下面是我的代码生成的有效负载示例: { "ClubOfficer":{ "_ti_club_officer_code_value":"6efab90f-7d2b-e811-a957-000d3a34a108", "ti_club_id":{ "accountid":"cbf646cb-a232-e811-a959-000d3

我相信这个问题与这里链接的问题不同:

我有一个全局操作,它接受
ClubOfficer
实体作为必需的输入参数。下面是我的代码生成的有效负载示例:

{
    "ClubOfficer":{
        "_ti_club_officer_code_value":"6efab90f-7d2b-e811-a957-000d3a34a108",
        "ti_club_id":{
            "accountid":"cbf646cb-a232-e811-a959-000d3a34a0aa"
        },
        "ti_member":{
            "contactid":"e318472c-c732-e811-a959-000d3a34ae50"
        },
        "ti_start_date":"2018-07-01T00:00:00Z",
        "ti_end_date":"2018-12-31T23:59:59Z"
    },
    "Term":"Current"
}
但是,在调用该操作之前,它会失败,并出现以下错误:

{
    "error": {
        "code": "0x0",
        "message": "CRM do not support direct update of Entity Reference properties, Use Navigation properties instead.",
        "innererror": {
            "message": "CRM do not support direct update of Entity Reference properties, Use Navigation properties instead.",
            "type": "Microsoft.Crm.CrmHttpException",
            "stacktrace": "   at Microsoft.Crm.Extensibility.OData.TypeConverters.EntityReferenceAttributeTypeConverter.ConvertToCrmTypeInternal(Guid edmTypeValue)\r\n   at Microsoft.Crm.Extensibility.OData.TypeConverters.EdmTypeConverterBase`2.ConvertToCrmType(Object edmTypeValue)\r\n   at Microsoft.Crm.Extensibility.OData.TypeConverters.EdmEntityTypeConverter.SetStructuralPropertyToXrmEntity(Entity entity, EntityMetadata entityMetadata, String crmAttributeName, IEdmProperty edmProperty, Object propertyValue)\r\n   at Microsoft.Crm.Extensibility.OData.TypeConverters.EdmEntityTypeConverter.ConvertToCrmTypeInternal(EdmEntityObject edmTypeValue)\r\n   at Microsoft.Crm.Extensibility.OData.TypeConverters.EdmTypeConverterBase`2.ConvertToCrmType(Object edmTypeValue)\r\n   at Microsoft.Crm.Extensibility.ODataV4.Converters.TypeConverters.OnDemandEdmEntityTypeConverter.ConvertToCrmTypeInternal(EdmEntityObject edmTypeValue)\r\n   at Microsoft.Crm.Extensibility.OData.TypeConverters.EdmTypeConverterBase`2.ConvertToCrmType(Object edmTypeValue)\r\n   at Microsoft.Crm.Extensibility.OData.RequestResponseConverter.AddSDKRequestParameterFromEdmOperationParameter(IEdmModel edmModel, IEdmOperation edmOperation, ParameterCollection parameterCollection, KeyValuePair`2 parameter, Tuple`2 messagePair)\r\n   at Microsoft.Crm.Extensibility.OData.RequestResponseConverter.GetRequestParamsFromOperationRequest(IEdmModel edmModel, IEdmOperation edmOperation, Dictionary`2 parameters, Dictionary`2 boundParameters, Tuple`2 messagePair, Dictionary`2 offlineData)\r\n   at Microsoft.Crm.Extensibility.OData.CrmODataServiceDataProvider.ExecuteOperation(CrmODataExecutionContext context, EdmOperation edmOperation, Dictionary`2 parameters, Dictionary`2 boundParameters)\r\n   at Microsoft.Crm.Extensibility.OData.ActionController.ProcessOperationRequest(String operationName, Dictionary`2 operationParameters, EntityReference entityReference, String boundEntityName, String boundEntityType)\r\n   at Microsoft.Crm.Extensibility.OData.ActionController.<>c__DisplayClass9_0.<PostUnboundAction>b__0()\r\n   at Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute[TResult](ILogger logger, EventId eventId, ActivityType activityType, Func`1 func, IEnumerable`1 additionalCustomProperties)\r\n   at Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute[TResult](ILogger logger, XrmTelemetryActivityType activityType, Func`1 func)\r\n   at lambda_method(Closure , Object , Object[] )\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
        }
    }
}
{
“错误”:{
“代码”:“0x0”,
“消息”:“CRM不支持直接更新实体引用属性,请改用导航属性。”,
“内部错误”:{
“消息”:“CRM不支持直接更新实体引用属性,请改用导航属性。”,
“类型”:“Microsoft.Crm.CRMHTTPEException”,
“stacktrace”:“位于Microsoft.Crm.Extensibility.OData.TypeConverters.EntityReferenceAttributeTypeConverter.ConvertToCrmTypeInternal(Guid edmTypeValue)\r\n位于Microsoft.Crm.Extensibility.OData.TypeConverters.EdmTypeConverterBase`2.ConvertToCrmType(对象edmTypeValue)\r\n位于Microsoft.Crm.Extensibility.OData.TypeConverters.EdmEntityTypeConverter.SetStructuralPropertyToXrmEntity(实体实体实体、实体元数据实体元数据、字符串CrMattTributeName、IEdmProperty edmProperty、对象属性值)\r\n位于Microsoft.Crm.Extensibility.OData.TypeConverters.EdmEntityTypeConverter.ConvertToCrmTypeInternal(EdmEntityObject edmTypeValue)\r\n位于Microsoft.Crm.Extensibility.OData.TypeConverters.EdmTypeConverterBase`2.ConvertToCrmType(Object edmTypeValue)\r\n位于Microsoft.Crm.Extensibility.ODataV4.Converters.TypeConverters.OnDemandEntityTypeConverter.ConvertToCrmTypeInternal(EdmentyObject edmTypeValue)\r\n位于Microsoft.Crm.Extensibility.OData.TypeConverters.EdmTypeConverterBase`2.ConvertToCrmType(对象edmTypeValue)\r\n位于Microsoft.Crm.Extensibility.OData.RequestResponseConverter.AddSdKresquestParameterFromEdmOperationParameter(IEdmModel edmModel、IEdmOperation edmOperation、ParameterCollection ParameterCollection、KeyValuePair`2参数、元组`2消息对)\r\n位于Microsoft.Crm.Extensibility.OData.RequestResponseConverter.GetRequestParamsFromOperationRequest(IEdmModel edmModel、IEdmOperation edmOperation、Dictionary`2参数、Dictionary`2边界参数、元组`2消息对、Dictionary`2脱机数据)\r\n位于Microsoft.Crm.Extensibility.OData.CrmODataServiceDataProvider.ExecuteOperation(在Microsoft.Crm.Extensibility.OData.ActionController.ProcessOperationRequest(字符串操作名,字典'2操作参数,EntityReference EntityReference,字符串boundEntityName,字符串boundEntityType)上的(CrmODataExecutionContext上下文,EdmOperation EdmOperation,字典'2参数,字典'2边界参数)\r\n\r\n在Microsoft.Crm.Extensibility.OData.ActionController.c_uuuDisplayClass9_0.b_uu0()\r\n在Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute[TResult](ILogger,EventId EventId,ActivityType ActivityType,Func`1 Func,IEnumerable`1 additionalCustomProperties)\r\n在Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute[TResult](ILogger,XrmTelemetryActivityType activityType,Func`1 Func)\r\n在lambda_方法(Closure,Object,Object[])\r\n在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c_DisplayClass10.b_u9(对象实例,对象[]方法参数)\r\n位于System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext,IDictionary`2参数,CancellationToken CancellationToken)\r\n--来自引发异常的上一个位置的堆栈结束跟踪---\r\n位于System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n位于System.Web.Http.Controllers.ApiControllerActionInvoker.d_u0.MoveNext()\r\n---来自引发异常的上一个位置的堆栈结束跟踪---\r\n位于System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n位于System.Web.Http.Controllers.ActionFilterResult.d\u 2.MoveNext()\r\n--从引发异常的上一个位置开始的堆栈结束跟踪---\r\n位于System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()处\r\n位于System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n位于System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u1.MoveNext()
}
}
}

ClubOfficer不是一个现有实体,但我希望该操作将其视为ClubOfficer临时实体,以便我可以利用“类型安全性”实体属性的。这可能吗?或者我必须将ClubOfficer作为字符串参数传递,然后对JSON字符串进行操作吗?此错误的原因是什么?我该如何修复它?

不幸的是,这是不可能的。您没有将整个实体传递给操作,您只传递实体引用,这只是n实体的名称及其ID。因此您无论如何都无法传递其他值

正确的方法是为每个输入创建额外的输入参数。这样它们将是强类型的。另一种方法是传递一个JSON字符串负载,您可以使用自定义活动解析该负载


希望有帮助!

不幸的是,这是不可能的。您没有将整个实体传递给操作,您只传递实体引用,它只是实体的名称及其ID。因此,您无论如何都无法传递其他值

正确的方法是为每个输入创建额外的输入参数。这样它们将是强类型的。另一种方法是传递一个JSON字符串负载,您可以使用自定义活动解析该负载

希望有帮助