是否可以跟踪Dynamics CRM中实体元数据的更改?

时间:2017-09-13 18:45:53

标签: dynamics-crm dynamics-crm-2011 dynamics-crm-2013 dynamics-crm-2015 dynamics-crm-365

有没有办法跟踪元数据的更改,比如新字段,新实体等?

在同一环境中很难控制一个非常大的项目,因此有时会有一些不应该部署到生产中的定制(大多数是错误或在开发环境中测试)。

有一种方法可以知道是谁进行了这种定制吗?

我希望了解每一个可能的变化,而不是特别的变化。

2 个答案:

答案 0 :(得分:2)

您必须使用 RetrieveMetadataChangesRequest ,并且无法知道是谁进行了更改。

仅适用于 Microsoft Dynamics CRM 2011更新汇总12

此请求旨在用于缓存元数据和be able to work offline中的信息,但我们可以使用它来跟踪复杂项目和复杂团队中元数据的更改

互联网上的示例不是很友好,所以这就是你如何使用请求:

只有填写一个参数

才能完成请求
RetrieveMetadataChangesRequest req = new RetrieveMetadataChangesRequest()
{
    ClientVersionStamp = null
};
var response = (RetrieveMetadataChangesResponse)service.Execute(req);

第一次执行此请求ClientVersionStamp需要为空,因为之前没有对元数据发出请求且没有ClientVersionStamp。此参数是您最后一次查询元数据更改,如果它为null,它将始终显示所有自定义,因此可能此请求无法按时完成,因此我们需要进行调整。

var EntityFilter = new MetadataFilterExpression(LogicalOperator.And);
EntityFilter.Conditions.Add(new MetadataConditionExpression("SchemaName", MetadataConditionOperator.Equals, "ServiceAppointment"));
var entityQueryExpression = new EntityQueryExpression()
        {
            Criteria = EntityFilter
        };
RetrieveMetadataChangesRequest req = new RetrieveMetadataChangesRequest()
        {
            Query = entityQueryExpression,
            ClientVersionStamp = null
        };
var response = (RetrieveMetadataChangesResponse)service.Execute(req);

这将查询“ServiceAppointment”的所有元数据更改,随意使用您想要的实体,但我们需要的是来自响应的ServerTimeStamp,它看起来像"22319800!09/13/2017 16:17:46",如果您尝试发送此首先是时间戳,它会抛出异常,因此有必要先查询以获取服务器时间戳。

现在,您可以使用请求和时间戳来检索自"22319800!09/13/2017 16:17:46"

以来的所有新更改
RetrieveMetadataChangesRequest req = new RetrieveMetadataChangesRequest()
        {
          Query = entityQueryExpression,
          ClientVersionStamp = @"22319800!09/13/2017 16:17:46"
        };

var response = (RetrieveMetadataChangesResponse)service.Execute(req);

您可以过滤查询以满足您的需求,只搜索特定实体,标签,关系,键和属性或特定属性。

EntityQueryExpression entityQueryExpression = new EntityQueryExpression()
{
    Criteria = EntityFilter,
    Properties = EntityProperties,
    RelationshipQuery = new RelationshipQueryExpression()
    {
        Properties = RelationshipProperties,
        Criteria = RelationshipFilter
    },
    AttributeQuery = new AttributeQueryExpression()
    {
        Properties = AttributeProperties,
        Criteria = AttributeFilter
    }
};

使用此请求并按您需要的方式实施。

答案 1 :(得分:0)

还有更多选择:

  1. 在Publish and Publish All上注册一个插件,并跟踪谁做了 发布和何时。这可能会帮助您缩小制作人员的范围 变化,虽然有人可以在技术上做出改变而没有 发布它,所以不是完美的信息。

  2. 如果您正在使用Dynamics OnPremise,则元数据表有时会存储有关通过元数据检索无法进行更改的人员的信息。我发现这很不稳定,并非所有元数据都存储了修改者用户。