Невозможно обновить поле OptionSetValue в пользовательском объекте CRM 2011 - PullRequest
1 голос
/ 25 октября 2011

Я получаю «Указанный актерский состав недействителен».Исключение при попытке обновить атрибут OptionSetValue настраиваемого поля в настраиваемом объекте.

Это работает:

data = new Xrm.Xyz_data()
{
  Xyz_dataId = (Guid)entity["xyz_dataId"],
  // Xyz_dataStatus = new OptionSetValue(5),
  Xyz_IsSyncReqd = true
};

service.Update(data);

Но раскомментируйте строку OptionSetValue и выдается это исключение:

System.ServiceModel.FaultException`1[Microsoft.Xrm.Sdk.OrganizationServiceFault]: Specified cast is not valid. (Fault Detail is equal to Microsoft.Xrm.Sdk.OrganizationServiceFault).

С этой трассировкой стека:

Server stack trace: 
   at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at Microsoft.Xrm.Sdk.IOrganizationService.Update(Entity entity)
   at Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.UpdateCore(Entity entity)
   at Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.Update(Entity entity)

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

Итак, я наконец понял, что происходит. Я включил отладку на стороне сервера, используя те же параметры реестра, что и в CRM 4.0:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM]
"TraceEnabled"=dword:00000001
"TraceCategories"="*:Error"
"TraceCallStack"=dword:00000001
"TraceRefresh"=dword:00000001 

Я перезапустил тест, который не прошел, и обнаружил эту ошибку:

[2011-10-24 18:19:37.990] Process: w3wp |Organization:00000000-0000-0000-0000-000000000000 |Thread:   14 |Category: Platform |User: 00000000-0000-0000-0000-000000000000 |Level: Error | ExceptionConverter.ConvertMessageAndErrorCode
    at ExceptionConverter.ConvertMessageAndErrorCode(Exception exception, Int32& errorCode)
    at ExceptionConverter.ToSingleFaultOther(Exception exception)
    at ExceptionConverter.ToSingleFaultUntyped(Exception exception)
    at ExceptionConverter.ConvertToFault(Exception exception)
    at ExceptionConverter.TryConvertToFaultExceptionInternal(Exception exception, Boolean createNewFaultException, FaultException`1& faultException)
    at FaultHelper.ConvertToFault(Exception exception)
    at OrganizationSdkServiceInternal.Update(Entity entity, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType)
    at 
    at SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
    at DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
    at ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
    at ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
    at MessageRpc.Process(Boolean isOperationContextSet)
    at ChannelHandler.DispatchAndReleasePump(RequestContext request, Boolean cleanThread, OperationContext currentOperationContext)
    at ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext)
    at ChannelHandler.AsyncMessagePump(IAsyncResult result)
    at AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
    at AsyncResult.Complete(Boolean completedSynchronously)
    at ReceiveItemAndVerifySecurityAsyncResult`2.InnerTryReceiveCompletedCallback(IAsyncResult result)
    at AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
    at AsyncResult.Complete(Boolean completedSynchronously)
    at AsyncQueueReader.Set(Item item)
    at InputQueue`1.Dispatch()
    at ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
    at IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
    at _IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
>System.InvalidCastException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #9F125FAE: System.InvalidCastException: Specified cast is not valid.
>   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.IntentionalRethrow(Exception chainException, Exception originalException)
>   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.RethrowRecommended(Exception chainException, Exception originalException)
>   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.Handle(Exception exceptionToHandle)
>   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyImpl.HandleException(Exception exceptionToHandle)
>   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicy.HandleException(Exception exceptionToHandle, String policyName, ExceptionPolicyFactory policyFactory)
>   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicy.HandleException(Exception exceptionToHandle, String policyName)
>   at Common.Services.ExceptionPolicy.HandleException(Exception exceptionToHandle, String policyName)
>   at XYZ.CRM.Common.Services.ExceptionPolicy.HandleException(Exception exceptionToHandle, String policyName)
>   at XYZ.CRM.Plugin.Common.PluginBase.OnError(Exception ex)
>   at XYZ.CRM.Plugin.Common.PluginBase.Execute(IServiceProvider serviceProvider)
>   at Microsoft.Crm.Extensibility.V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext context)
>   at Microsoft.Crm.Extensibility.VersionedPluginProxyStepBase.Execute(PipelineExecutionContext context)

И так как я отлаживал свой плагин с помощью юнит-теста, я понял, что другой плагин запускался, когда эти поля обновлялись моим плагином, и этот плагин, очевидно, вызывал исключение. Но еще хуже было то, что обработчик исключений вызывал другое исключение, которое возвращалось, маскируя истинное исключение. Я протестировал действительно простое исправление, съев любые исключения, которые может выдавать обработчик исключений, и теперь он работает отлично! Теперь, чтобы узнать, почему мой другой плагин не работает ...

0 голосов
/ 25 октября 2011

Мне это кажется правильным - я не использую раннее связывание, как, по-видимому, вы делаете, но можете ли вы убедиться, что контекст данных был обновлен с момента создания и публикации атрибута picklist?

Еслиэто встроенное поле состояния, которое вам, вероятно, потребуется сначала выполнить обновление, а затем выполнить UpdateStateValueRequest.Выдержка из CRM 2011 SDK -

#region How to update state value
// Modify the state value label from Active to Open.
// Create the request.
UpdateStateValueRequest updateStateValue = new UpdateStateValueRequest
{
    AttributeLogicalName = "statecode",
    EntityLogicalName = Contact.EntityLogicalName,
    Value = 1,
    Label = new Label("Open", _languageCode)
};

// Execute the request.
_serviceProxy.Execute(updateStateValue);

#endregion How to update state value
...