0

有什么办法来追踪变化的元数据,如新领域,新的实体等等?是否有可能在Dynamics CRM中跟踪对实体元数据的更改?

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

而且有一种方法可以知道是谁做的是定制?

我看了就知道每一个可能的变化,没有任何特别。

+0

的可能的复制[是否可以在网上检索动态CRM架构更改信息?(https://stackoverflow.com/questions/41575510/is-it-possible-to-retrieve-schema-change -information-in-dynamics-crm-online) –

+0

@ArunVinoth这是一个具体的问题,不是很清楚,我一直在寻找一段时间,没有人可以很清楚地回答这个问题,甚至没有官方文档,你欢迎对我的回答作出贡献。 – Sxntk

+0

当然,如果我的回答是有帮助的,upvote它。 –

回答

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第一次。此参数是您查询元数据更改的最后时间,如果它是空它会带来所有定制的所有时间,所以可能这个请求将不能按时完成,所以我们需要调补。

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

使用此请求并按需要实施它。

0

一对夫妇更多的选择:

  1. 注册上发布和发布所有插件,并跟踪谁做 发布和时间。这可以帮助你缩小谁是做 变化,尽管有人可能会在技术上做出改变,而不 发布,所以不完美信息。

  2. 如果您使用Dynamics OnPremise,则元数据表有时会存储有关谁进行了通过元数据检索不可见的更改的信息。但是,我发现这是非常多斑点的,并非所有元数据都有一个Modified By用户存储。

+0

Matt,你能更具体吗?如何才能知道发布的“谁”? – Sxntk

+0

您可以从插件执行上下文中获取它:InitiatingUserId(https://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.iexecutioncontext.initiatinguserid.aspx) – Matt

+0

当我按下发布按钮时, xml没有任何相关的内容,只有实体的名称 – Sxntk

相关问题