【发布时间】:2015-09-03 15:22:08
【问题描述】:
我正在尝试恢复某些给定记录的特定版本。
审核已开启相关实体。我的程序需要从 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 循环并将记录的属性设置为旧属性的属性?
【问题讨论】:
-
我编辑,记录,而不是实体
-
@GuidoPreite(或任何其他编辑)请不要更改要记录的实体!!!在 crm 中,您所谓的记录被定义为实体,并且创建您所谓的“记录”实例的类也被称为实体。和你在Sharepoint中调用一个记录ListItem一样,而不是记录...
-
让我明确一点:在 Dynamics CRM 内部,
Entity是一个由字段(如帐户及其属性名称、地址等)组成的定义结构,Record是 @ 的一个实例987654325@(如 A 公司,地址为 110 West Street)。Audit记录Record级别的更改(因此数据的更改)而不是Entity级别(例如添加了自定义字段或地址字段已从 100 个字符扩展到 200 个字符)。现在,如果您想恢复在Record级别所做的意外更改,您不了解我的编辑,如果您想恢复在Entity级别所做的更改,您不了解Audit -
@GuidoPreite:在
Microsoft.Xrm库中,Entity类实际上是 一个实体。我认为 SDK 的设计者选择这个名称时考虑了领域驱动设计原则。在 DDD 词汇表中,实体和属性是关键的构建块,它们的 CRM 对应物非常符合它们的目的。您所指的实体属于数据建模领域。在这里,通常将实体和属性视为数据模型的构建块。记录和字段定义了数据在表和视图中的存储方式。 -
@HenkvanBoeijen 不,当我说实体时,我指的是 CRM 内部唯一的东西是实体。在
Microsoft.Xrm中您需要实例化一个Entity类(以便处理记录)这一事实并不意味着我们可以更改在CRM 中调用这些事物的方式。对于 CRM 4.0,名称是 BusinessEntity 或 DynamicEntity,如果您使用 JS,您可以使用var account = new Object();。或者明天我们需要开始以EntityReference调用 CRM 查找,只是因为 SDK 库使用具有该名称的类来处理查找?
标签: c# dynamics-crm-2013 xrm