如何在C#中调用Organization Service仅更新Microsoft Dynamics实体指定字段
解决Dynamics 365 Organization Service全量更新问题
嘿,这个问题我之前做Dynamics集成开发时也踩过坑!你现在的写法是先读取完整实体再更新,Dynamics会把这个实体的所有字段都标记为待更新,哪怕你只改了一两个。要实现仅更新指定字段,其实只需要创建一个只包含主键和目标字段的轻量级实体实例就行,完全不用加载整个实体。
最优解决方案:直接创建精简实体更新
不需要先读取整个账户实体,直接构造一个只带必要信息的Entity对象:
// 1. 创建Account实体实例,指定实体逻辑名称 Entity accountToUpdate = new Entity("account"); // 2. 设置要更新记录的主键ID(这一步必须,告诉Dynamics要操作哪条记录) accountToUpdate.Id = targetAccountId; // 替换成你要更新的账户ID // 3. 只添加需要更新的字段 accountToUpdate["fieldName1"] = newValue; accountToUpdate["fieldName2"] = newValue2; // 4. 调用更新,此时只会更新你指定的字段 organizationService.Update(accountToUpdate);
如果必须先读取实体(比如基于原字段计算新值)
如果你确实需要先读取实体的某些字段来计算新值,那读取时尽量只获取需要的字段,然后再构造精简的更新实体:
// 读取实体时,只加载需要用到的字段(别用new ColumnSet(true)全量读取) ColumnSet neededColumns = new ColumnSet("oldFieldToCalculate"); Entity account = organizationService.Retrieve("account", targetAccountId, neededColumns); // 基于原字段计算新值 var newValue = $"{account["oldFieldToCalculate"]}_updated"; // 构造仅含主键和更新字段的实体 Entity accountToUpdate = new Entity("account") { Id = account.Id }; accountToUpdate["fieldName1"] = newValue; accountToUpdate["fieldName2"] = newValue2; // 执行更新 organizationService.Update(accountToUpdate);
关键原理
Dynamics的Update方法判断哪些字段需要更新,是基于你传入的Entity对象中包含的Attributes集合。只要你只添加需要更新的字段,服务就只会处理这些字段的更新,不会触发全量字段的修改,同时还能减少网络传输量。
内容的提问来源于stack exchange,提问作者TeoVr81
相关产品推荐
相关产品推荐

