无法更新CRM 2011自定义实体上的OptionSetValue字段

时间:2011-10-24 20:06:20

标签: dynamics-crm-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 :(得分:0)

这对我来说是正确的 - 我不使用它看起来像你正在做的早期绑定但是你可以验证自创建和发布选项列表属性以来数据上下文是否已刷新?

如果这是内置状态字段,您可能需要先进行更新,然后再执行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

答案 1 :(得分:0)

所以我终于弄清楚发生了什么。我使用与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)

由于我是通过单元测试来调试我的插件,我意识到当我的插件更新这些字段时,另一个插件被触发,而该插件显然导致异常。但更糟糕的是,异常处理程序导致了另一个异常,即返回,掩盖了真正的异常。我通过吃异常处理程序可能抛出的任何异常来测试一个非常简单的修复,现在它运行得很好!现在来发现我的其他插件失败的原因......