Microsoft.Xrm.Sdk.SaveChangesException в CRM 2011 - PullRequest
4 голосов
/ 05 декабря 2011

Я недавно начал работать с плагинами в CRM 2011, и у меня возникли проблемы с плагинами, зарегистрированными в сообщении «Создать» как постоперация.

Когда я регистрирую создание как постоперацию, я ожидаю, что когда я нажму код плагина, сущность уже будет создана в базе данных, и я смогу создать связанную сущность (связанную свновь созданный объект по внешнему ключу) в плагине.Но когда я создаю связанную сущность и обновляю ее, и говорю SaveChanges (), она дает мне Microsoft.Xrm.SaveChangesException «Произошла ошибка при обработке этого запроса»

И если я детализирую внутреннее исключениеэто просто указывает на ServiceServiceFault.Трассировка стека, которую он показывает:

Трассировка стека сервера: в System.ServiceModel.Channels.ServiceChannel.HandleReply (операция ProxyOperationRuntime, ProxyRpc & rpc) в System.ServiceModel.Channels.ServiceChannel.Call (string, булева OneWay, операция ProxyOperationRuntime, Object [] модули, Object [] выходы, TimeSpan тайм-аут) в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, эксплуатации ProxyOperationRuntime) при System.ServiceModel.Channels.ServiceChannelProxy.Invoke (IMessage сообщения)

Исключение переброшено в [0]: в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (DataData)тип) в Microsoft.Xrm.Sdk.IOrganizationService.Execute (запрос OrganizationRequest) в Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.ExecuteCore (запрос OrganizationRequest) в Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute (запрос OrganizationRequest) в Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChange (запрос OrganizationRequest, результаты IList`1

Я сталкиваюсь с этой проблемой только в сообщении создания, если я выполняю запроста же операция по обновлению или удалению, работает нормально.Кто-нибудь сталкивался с этой проблемой?Пожалуйста, предоставьте некоторые материалы о том, что я могу попытаться решить эту проблему.Спасибо заранее!

Кроме того, вот мой код плагина.

Плагин запускается при создании сущности ct_repcode, а затем в своем плагине я создаю сущность ct_repcodeMember, которая имеет поле ct_repcodeid, котороессылки на фактическую сущность ct_repcode.

Entity repcodeEntity = _context.InputParameters["Target"] as Entity;                 
Guid repcodeId = repcodeEntity.Id;

//Create a new Ct_repcodemember object    
Ct_repcodemember repcodeMember = new Ct_repcodemember();    
Guid repCodeMemberId = _service.Create(repcodeMember);

repcodeMember = _serviceContext.Ct_repcodememberSet.Where(a => a.Id == repCodeMemberId).FirstOrDefault();        
repcodeMember.ct_repcodeid = new EntityReference { Id = repcodeId };            

//Update the object and save the changes in crm    
_serviceContext.UpdateObject(repcodeMember);    
_serviceContext.SaveChanges(); // --- The timeout error happens here

Ответы [ 4 ]

2 голосов
/ 23 января 2012

Я тоже сталкивался с этой проблемой раньше. Я полагаю, что проблема в том, что в CRM 2011 операции Pre и Post выполняются, пока вы все еще находитесь внутри транзакции базы данных.

Способ, которым мы обошли это, - перевернуть плагин для асинхронной работы, так как синхронный результат не был необходим.

Я не уверен, есть ли другой способ обойти это с вашей текущей структурой кода. Я тоже не пробовал, но, учитывая, что вы можете просто создать сущность, вы можете создать сущность repcodeMember с заполненным поиском? Есть ли реальная необходимость в создании, получении и обновлении? Если у вас есть какой-то код, который выполняется при создании связанной сущности, вы можете поделиться им с этим плагином, так что вы можете просто выполнить прямое создание, так как это обновление вызывает проблемы.

1 голос
/ 17 декабря 2013

Отдавая должное @rocksolid и @patricgh, я просто взял их предложения, соединил их и привел пример кода.

Вам следует отказаться от использования Service Context для этой операции и использовать CRUD-функциональность CRM по умолчанию. Ваш EntityReference неверен, потому что у вас должно быть логическое имя, но, поскольку у вас уже есть Entity, вам просто нужно использовать EntityReference для установки значения.

Entity repcodeEntity = _context.InputParameters["Target"] as Entity;                 

Ct_repcodemember repcodeMember = new Ct_repcodemember();    

repcodeMember.ct_repcodeid = repcodeEntity.ToEntityReference(); 

_service.Create(repcodeMember);
1 голос
/ 15 декабря 2013

Вы также можете попробовать установить логическое имя для ссылки на сущность ct_repcodeid, похоже, вы устанавливаете только Id.

0 голосов
/ 19 июля 2013

Я думаю, что вы сделали: создание, поиск и обновление сущности через контекст не очень хороший способ.Вы можете просто создать объект, я имею в виду обновление объекта, а затем создать его через сервис.Я поставил код, как показано ниже.

Entity repcodeEntity = _context.InputParameters["Target"] as Entity;                 
Guid repcodeId = repcodeEntity.Id;

Ct_repcodemember repcodeMember = new Ct_repcodemember();    

repcodeMember.ct_repcodeid = new EntityReference { Id = repcodeId }; 

_service.Create(repcodeMember);
...