Dataverse迁移中如何保留createdon、createdby等4个系统字段值?
保留Dataverse迁移记录元数据的解决方案
Dataverse默认会自动生成createdon/createdby/modifiedon/modifiedby这四个系统元数据字段,常规写入操作会覆盖源记录的原始值。仅用overriddencreatedon只能覆盖createdon,要完整保留这四个字段的源数据,需借助Dataverse的特殊请求配置,以下是具体实现方式:
使用Dataverse SDK(C#)实现
通过CreateRequest或UpdateRequest的SuppressAutoCreatedModified参数,禁止系统自动生成元数据,直接赋值源记录的四个字段:
using Microsoft.PowerPlatform.Dataverse.Client; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; // 初始化服务连接 var serviceClient = new ServiceClient("你的Dataverse连接字符串"); // 从源记录获取的元数据信息 DateTime sourceCreatedOn = new DateTime(2023, 1, 1, 0, 0, 0, DateTimeKind.Utc); Guid sourceCreatedById = new Guid("源环境创建用户ID"); DateTime sourceModifiedOn = new DateTime(2023, 1, 2, 0, 0, 0, DateTimeKind.Utc); Guid sourceModifiedById = new Guid("源环境修改用户ID"); // 构造目标实体 var targetEntity = new Entity("你的实体逻辑名称"); targetEntity["name"] = "测试记录"; // 实体业务字段示例 // 直接赋值系统元数据字段 targetEntity["createdon"] = sourceCreatedOn; targetEntity["createdby"] = new EntityReference("systemuser", sourceCreatedById); targetEntity["modifiedon"] = sourceModifiedOn; targetEntity["modifiedby"] = new EntityReference("systemuser", sourceModifiedById); // 创建请求并设置关键参数 var createReq = new CreateRequest { Target = targetEntity, SuppressAutoCreatedModified = true // 禁止系统自动覆盖元数据 }; // 执行请求 var createResp = (CreateResponse)serviceClient.Execute(createReq);
使用Web API实现
在请求头中添加MSCRM.SuppressAutoCreatedModified: true,然后在请求体中直接传入四个元数据字段:
POST [你的组织URI]/api/data/v9.2/[实体逻辑名称集合] Headers: Content-Type: application/json MSCRM.SuppressAutoCreatedModified: true Body: { "name": "测试记录", "createdon": "2023-01-01T00:00:00Z", "createdby@odata.bind": "/systemusers(源环境创建用户ID)", "modifiedon": "2023-01-02T00:00:00Z", "modifiedby@odata.bind": "/systemusers(源环境修改用户ID)" }
关键注意事项
- 执行操作的用户必须拥有写入审计历史(
prvWriteAuditHistory)权限,否则会触发权限错误 SuppressAutoCreatedModified参数仅对单条创建/更新请求生效,批量操作需为每个子请求单独配置- 若源环境的创建/修改用户在目标环境不存在,需先迁移这些用户记录,或映射到目标环境的对应用户,避免实体引用无效报错
- 部分系统实体可能限制修改元数据字段,自定义实体默认支持此操作
内容的提问来源于stack exchange,提问作者M. Lanza
相关产品推荐
相关产品推荐

