CRM 2015 Настраиваемое действие рабочего процесса, ошибка: объект доступен только для чтения, а свойство "Id" изменить нельзя
У меня возникли проблемы с работой настраиваемого рабочего процесса. Я вернул его к самому простому коду:
// TODO: Implement your custom Workflow business logic.
// Get the context
var xrmContext = new OrganizationServiceContext(service);
// Get an object that we can update
var client = (from a in xrmContext.CreateQuery("account")
where a.GetAttributeValue<Guid>("accountid") == new Guid("bfa273d1-d34c-e511-80cc-00155d021c08")
select a).Single();
// Make a change
client.Attributes["name"] = "Gray Test A - CHANGED";
// Write it out
xrmContext.UpdateObject(client);
xrmContext.SaveChanges();
Если вы создадите рабочий процесс, вы увидите, что он не становится намного проще, чем этот:
- Получить контекст
- Получить учетную запись
- Сделай самые простые изменения
- Обнови и сохрани.
Я получаю следующую ошибку в журнале трассировки:
[2016-02-26 15:15:09.328] Process:CrmAsyncService |Organization:00000000-0000-0000-0000-000000000000 |Thread: 36 |Category: Platform |User: 00000000-0000-0000-0000-000000000000 |Level: Error |ReqId: 00000000-0000-0000-0000-000000000000 | ExceptionConverter.ConvertMessageAndErrorCode ilOffset = 0x23B
> System.InvalidOperationException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #5CC91FB6: System.InvalidOperationException: The entity is read-only and the 'Id' property cannot be modified. Use the context to update the entity instead.
> at Microsoft.Xrm.Sdk.Entity.set_Id(Guid value)
> at Microsoft.Crm.Extensibility.ProxyPluginExecutionContext.CopyModifiedEntityAttributes(PipelineConversionContext context, Entity originalEntity, Entity newEntity)
> at Microsoft.Crm.Extensibility.ProxyPluginExecutionContext.ConvertPropertyBagToParameterCollection(PipelineExecutionContext context, PropertyBag propertyBag, ParameterCollection originalParameterCollection)
> at Microsoft.Crm.Extensibility.ProxyPluginExecutionContext.Dispose(Boolean disposing)
> at Microsoft.Crm.Extensibility.VersionedPluginProxyStepBase.GetImages(PipelineExecutionContext context, Object pluginDefinition)
> at Microsoft.Crm.Extensibility.ImageRetrievalStep.MergeEntityRequests(PipelineExecutionContext context, Dictionary`2 entityRequests)
> at Microsoft.Crm.Extensibility.ImageRetrievalStep.Execute(PipelineExecutionContext context)
> at Microsoft.Crm.Extensibility.PipelineInstrumentationHelper.Execute(Boolean instrumentationEnabled, String stopwatchName, ExecuteWithInstrumentation action)
> at Microsoft.Crm.Extensibility.Pipeline.Execute(PipelineExecutionContext context)
> at Microsoft.Crm.Extensibility.MessageProcessor.<>c__DisplayClass1.<RunStage>b__0()
> at Microsoft.Crm.Extensibility.PipelineInstrumentationHelper.Execute(Boolean instrumentationEnabled, String stopwatchName, ExecuteWithInstrumentation action)
> at Microsoft.Crm.Extensibility.MessageProcessor.RunStage(PipelineExecutionContext context, Int32 pipelineStage)
> at Microsoft.Crm.Extensibility.MessageProcessor.Execute(PipelineExecutionContext context)
> at Microsoft.Crm.Extensibility.InternalMessageDispatcher.Execute(PipelineExecutionContext context)
> at Microsoft.Crm.Extensibility.ExternalMessageDispatcher.ExecuteInternal(IInProcessOrganizationServiceFactory serviceFactory, IPlatformMessageDispatcherFactory dispatcherFactory, String messageName, String requestName, Int32 primaryObjectTypeCode, Int32 secondaryObjectTypeCode, ParameterCollection fields, CorrelationToken correlationToken, CallerOriginToken originToken, UserAuth userAuth, Guid callerId, Guid transactionContextId, Int32 invocationSource, Nullable`1 requestId, Version endpointVersion)
> at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.ExecuteRequestRequestWithInstrumentation(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, UserAuth userAuth, Guid targetUserId, OrganizationContext context, Boolean returnResponse, Boolean checkAdminMode, Object operation)
> at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, UserAuth userAuth, Guid targetUserId, OrganizationContext context, Boolean returnResponse, Boolean checkAdminMode)
> at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode)
> at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Execute(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode)
Я не могу понять, почему я не могу сделать эту самую простую из операций.
Кто-нибудь может пролить свет? Спасибо серый
1 ответ
Попробуйте прикрепить запись к контексту перед сохранением, вот так:
xrmContext.ClearChanges();
if (!xrmContext.IsAttached(client)) xrmContext.Attach(client);
xrmContext.UpdateObject(client);
xrmContext.SaveChanges();