是否可以跟踪 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
}
};
使用此请求并按您需要的方式实施。
还有几个选项:
在 Publish 和 Publish All 上注册一个插件,并跟踪谁注册了
发布时间。这可能会帮助你缩小谁在制造
改变,尽管有人可以在技术上做出改变而无需
发布它,所以不是完美的信息。
如果您使用的是 Dynamics OnPremise,元数据表有时会存储有关谁进行了更改的信息,这些信息通过元数据检索是不可见的。不过,我发现这非常参差不齐,并非所有元数据都存储了用户修改。
有什么方法可以跟踪对元数据的更改,例如新字段、新实体等?
在同一个环境下很难控制一个非常大的项目,所以有时会有一些定制不应该部署到生产中(大多数是错误或在开发环境中测试)。
有办法知道是谁进行了定制吗?
我想知道每一个可能的变化,而不是特别的变化。
您必须使用 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
}
};
使用此请求并按您需要的方式实施。
还有几个选项:
在 Publish 和 Publish All 上注册一个插件,并跟踪谁注册了 发布时间。这可能会帮助你缩小谁在制造 改变,尽管有人可以在技术上做出改变而无需 发布它,所以不是完美的信息。
如果您使用的是 Dynamics OnPremise,元数据表有时会存储有关谁进行了更改的信息,这些信息通过元数据检索是不可见的。不过,我发现这非常参差不齐,并非所有元数据都存储了用户修改。