Dataverse活动记录迁移:如何保留statecode、statuscode及历史数据?
解决Dataverse活动记录迁移中状态码设置的问题
核心原因
Dataverse创建活动记录时,默认初始状态为Open(statecode=0),若在创建阶段直接设置已完成状态(statecode=1),会触发系统状态验证——此时记录仍处于Open状态上下文,不允许直接绑定对应已完成状态的statuscode,这就是你收到报错的根源。
正确迁移步骤
1. 先创建基础记录,暂不设置状态码
创建活动记录时,只赋值createdby、modifiedby、modifiedon、ownerid及其他业务字段,保留系统默认的Open状态完成创建。
2. 记录创建后立即更新状态
创建成功后,单独执行更新操作,设置与源记录一致的statecode和statuscode:
- 邮件:设置
statecode=1(已完成)、statuscode=3(已发送) - 任务/信函/电话呼叫:按源记录的状态码组合对应更新即可
3. C#代码实现示例
将创建与更新操作放在同一逻辑中,保证流程原子性:
// 1. 创建邮件记录,不设置状态码 Entity email = new Entity("email"); email["subject"] = sourceEmail["subject"]; email["createdby"] = sourceEmail["createdby"]; email["modifiedby"] = sourceEmail["modifiedby"]; email["modifiedon"] = sourceEmail["modifiedon"]; email["ownerid"] = sourceEmail["ownerid"]; // 其他业务字段赋值... Guid emailId = service.Create(email); // 2. 更新状态码至目标值 Entity updateEmail = new Entity("email", emailId); updateEmail["statecode"] = new OptionSetValue(1); // 已完成 updateEmail["statuscode"] = new OptionSetValue(3); // 已发送 service.Update(updateEmail);
4. 预操作插件调整
如果用预操作插件处理历史字段,确保插件仅负责createdby、modifiedby等字段的赋值,不要涉及状态码逻辑,避免与系统默认状态验证冲突。
额外注意事项
- 不同活动类型的状态码组合存在差异,迁移前需确认源环境中各活动的
statecode与statuscode对应关系,若目标环境有自定义状态,需先迁移状态元数据 - 已取消、已拒绝等特殊状态的设置,同样遵循“先创建再更新”的规则,符合Dataverse的状态流转逻辑
内容的提问来源于stack exchange,提问作者Frode Magnussen
相关产品推荐
相关产品推荐

