使用更改跟踪将数据与外部系统同步

 

发布日期: 2017年1月

适用于: Dynamics 365 (online),Dynamics 365 (on-premises),Dynamics CRM 2016,Dynamics CRM Online

Microsoft Dynamics 365 的更改跟踪功能提供了永久保持数据同步的方法:同时从最初解压缩或最后被同步开始就监测被更改的数据。 以前,没有此新功能,创建一个可靠而有效的机制以确定 Dynamics 365 中的哪些记录被更改非常困难。 本主题讨论如何检索实体的更改。

本主题内容

为实体启用更改跟踪

检索实体的更改

示例代码

为实体启用更改跟踪

在检索实体的更改之前,请确保更改跟踪功能已对该实体启用。 此功能可使用自定义用户界面 (UI) 或通过编程方法通过将 ChangeTrackingEnabled 属性设置为 True 来启用。 有关使用自定义用户界面 (UI) 的详细信息,请参阅启用更改跟踪以控制数据同步

检索实体的更改

在对实体启用更改跟踪时,您可以使用 RetrieveEntityChangesRequest 消息来检索该实体的更改。 初次使用此消息将返回该实体的所有记录,并且该数据可用于填充外部存储。 该消息还将返回一个版本号,其将与下一次 RetrieveEntityChangesRequest 消息的使用一起发送回来,以只返回该版本以后发生的更改的数据。

在检索实体更改时,您应了解以下限制:

  • 只有一个实体将在检索更改中被跟踪。 如果执行检索更改时没有版本/或令牌,服务器会将系统视为最低版本,会将所有记录作为新记录返回。 删除的对象不会返回。

  • 如果上一个令牌在 90 天默认值内,将返回更改。 如果超过 90 天,系统将返回所有记录。

  • 如果客户端有一组实体的更改,假如是 1,创建了一个记录,并在下次更改查询前删除了该记录,则会获得删除的项目,即使没有从该项目开始也是如此。

  • 记录按服务器端逻辑确定的顺序检索。 通常,最终用户始终会先收到所有新记录或已更新的记录(按版本号排序),然后再收到已删除的记录。  如果有 3000 条已创建或已更新的记录,2000 条已删除的记录,Dynamics 365 返回总共 5000 条记录,前 3000 条由新纪录或已更新的记录组成,后 2000 条由已删除的记录组成。

  • 如果新的或更新的项目集合大于 5000,用户可以翻阅集合。

示例代码

以下代码段演示 RetrieveEntityChangesRequest 消息如何用来检索实体的更改。 要了解完整示例,请参阅使用更改跟踪将数据与外部系统同步


string token;

// Initialize page number.
int pageNumber = 1;
List<Entity> initialrecords = new List<Entity>();

// Retrieve records by using Change Tracking feature.
RetrieveEntityChangesRequest request = new RetrieveEntityChangesRequest();
request.EntityName = _customBooksEntityName.ToLower();
request.Columns = new ColumnSet("sample_bookcode", "sample_name", "sample_author");
request.PageInfo = new PagingInfo() { Count = 5000, PageNumber = 1, ReturnTotalRecordCount = false };


// Initial Synchronization. Retrieves all records as well as token value.
Console.WriteLine("Initial synchronization....retrieving all records.");
while (true)
{
    RetrieveEntityChangesResponse response = (RetrieveEntityChangesResponse)_serviceProxy.Execute(request);

    initialrecords.AddRange(response.EntityChanges.Changes.Select(x => (x as NewOrUpdatedItem).NewOrUpdatedEntity).ToArray());
    initialrecords.ForEach(x => Console.WriteLine("initial record id:{0}", x.Id));
    if (!response.EntityChanges.MoreRecords)
    {
        // Store token for later query
        token = response.EntityChanges.DataToken;
        break;

    }
    // Increment the page number to retrieve the next page.
    request.PageInfo.PageNumber++;
    // Set the paging cookie to the paging cookie returned from current results.
    request.PageInfo.PagingCookie = response.EntityChanges.PagingCookie;
}

另请参阅

定义实体的备用键
使用备用键创建记录
使用 Upsert 插入或更新记录

Microsoft Dynamics 365

© 2017 Microsoft。 保留所有权利。 版权