2015-09-03 3 views
0

Я пытаюсь восстановить определенную версию для некоторых данных.Как восстановить определенную версию записи

Аудит включен объектами, о которых идет речь. Моя программа должна выбрать определенную версию из записи crm и отменить все свойства и изменения, сделанные для восстановления старой версии записи.

Это в основном для того, чтобы обратить вспять некоторые изменения, которые произошли случайно на продуктивной системе. Я использую Xrm для доступа к серверу.

Также я попытался найти некоторые связанные функции на объекте Xrm или наборе данных xrm, но не нашел их.

До сих пор я нашел способ получить историю версий данной записи:

  var xrm = new XrmServiceContext(CrmHelper.GetCrmConnection(ConfigurationManager.ConnectionStrings["Xrm"] + "SG")); 

      var changeRequest = new RetrieveRecordChangeHistoryRequest(); 
      changeRequest.Target = new EntityReference("account", new Guid("{D4E0990C-41C8-E211-B824-005056997F7A}")); 

      var changeResponse = (RetrieveRecordChangeHistoryResponse)xrm.Execute(changeRequest); 
      var details = changeResponse.AuditDetailCollection; 

      for (int i = 0; i < details.Count; i++) 
      { 
       if (typeof (AttributeAuditDetail).Name == details[i].GetType().Name) 
       { 
        AttributeAuditDetail detail = details[i] as AttributeAuditDetail; 

        Entity entity = detail.OldValue; 
       } 
      } 

Однако, как я могу убрать изменения обратно в detail.OldValue? Должен ли я сделать цикл foreach над каждым атрибутом и установить атрибут записи на старые?

+0

Я редактировал, записывал, а не сущность –

+0

@GuidoPreite (или любые другие редакторы) Пожалуйста, не меняйте Entity для записи !!! В crm то, что вы называете записью, определяется как сущность, а также класс, чтобы сделать экземпляр того, что вы называете «записью», называется сущностью. Это то же самое, что вы вызываете запись ListItem в Sharepoint, а не записываете ... – RononDex

+1

Позвольте мне пояснить: внутри Dynamics CRM 'Entity' - это определенная структура, состоящая из полей (например, Account и ее атрибутов Name, Address, ...), а 'Record' - это экземпляр« Entity »(например, компания A с адресом 110 West Street). «Аудит» регистрирует изменения на уровне «Запись» (так что изменения данных) не на уровне «Entity» (например, добавлено настраиваемое поле или поле «Адреса» было расширено от 100 до 200 символов). Теперь, если вы хотите вернуть случайные изменения, сделанные на уровне «Запись», вы не поняли мое редактирование, если вы хотите отменить изменения, сделанные на уровне «Entity», вы не поняли «Аудит» –

ответ

2

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

Помните, что это может быть сложно. Например. вы можете столкнуться с проблемами ссылочной целостности. Также пользовательская бизнес-логика (плагины, бизнес-правила) может блокировать запланированные обновления или иметь нежелательные побочные эффекты (рабочие процессы).

К счастью, ваше корректирующее обновление будет записано в таблице аудита, так что вы тоже сможете это исправить. :-)

+0

Я боялся, что я должен идти этим путем. Я попробую это решение и отчитаю! – RononDex