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

Is it possible to track changes to Entity Metadata in Dynamics CRM?

有什么方法可以跟踪对元数据的更改,例如新字段、新实体等?

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

有办法知道是谁进行了定制吗?

我想知道每一个可能的变化,而不是特别的变化。

您必须使用 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. 在 Publish 和 Publish All 上注册一个插件,并跟踪谁注册了 发布时间。这可能会帮助你缩小谁在制造 改变,尽管有人可以在技术上做出改变而无需 发布它,所以不是完美的信息。

  2. 如果您使用的是 Dynamics OnPremise,元数据表有时会存储有关谁进行了更改的信息,这些信息通过元数据检索是不可见的。不过,我发现这非常参差不齐,并非所有元数据都存储了用户修改。