2

有什么方法可以跟踪元数据的变化,比如新字段、新实体等?

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

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

我希望了解所有可能的变化,而不是特别的。

4

2 回答 2

4

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

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

此请求旨在用于缓存元数据中的信息并能够离线工作,但我们可以使用它来跟踪复杂项目和复杂团队中元数据的更改

互联网上的示例不是很友好,因此您可以这样使用请求:

只需填写一个参数即可完成请求

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
    }
};

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

于 2017-09-13T18:45:53.040 回答
0

还有几个选择:

  1. 在 Publish 和 Publish All 上注册一个插件,并跟踪发布者和发布时间。这可能会帮助您缩小进行更改的人员的范围,尽管从技术上讲,有人可以在不发布的情况下进行更改,因此信息并不完美。

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

于 2017-09-15T20:49:45.767 回答