使用Dataverse Client更新联系人后,CRM选择列表未显示对应文本
问题解决:Dataverse更新选项集后不显示对应文本
问题原因
Dataverse中的address1_stateorprovince和address1_country属于选项集(Picklist)字段,这类字段的存储逻辑是后台保存选项对应的整数值,前端显示关联的文本。你直接赋值文本缩写(如"OR"、"USA"),系统无法将其映射到对应选项的整数值,因此前端选择列表无法识别并显示对应文本。
解决步骤
1. 获取选项集对应的整数值
你需要先确定目标选项的整数ID:
- 手动获取:登录Dataverse后台,进入高级设置 > 自定义 > 自定义系统,找到
contact实体的address1_stateorprovince/address1_country字段,查看选项集里的选项值(每个选项都有对应的整数ID)。 - 代码动态获取:
using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Metadata; // 获取address1_stateorprovince字段的选项集元数据 var attributeRequest = new RetrieveAttributeRequest { EntityLogicalName = "contact", LogicalName = "address1_stateorprovince", RetrieveAsIfPublished = true }; var attributeResponse = (RetrieveAttributeResponse)serviceClient.Execute(attributeRequest); var picklistMetadata = (PicklistAttributeMetadata)attributeResponse.AttributeMetadata; // 遍历选项找到俄勒冈州对应的整数值 int orStateValue = picklistMetadata.OptionSet.Options .First(o => o.Label.UserLocalizedLabel.Label == "俄勒冈州") .Value.Value; // 同理获取美国对应的国家选项值 int usaCountryValue = picklistMetadata.OptionSet.Options .First(o => o.Label.UserLocalizedLabel.Label == "美国") .Value.Value;
2. 修改更新代码,使用整数值赋值
将原代码中的文本替换为对应的整数ID:
var contactUpdate = retrievedContact.Entities[0]; // 替换为实际获取到的整数值 contactUpdate["address1_stateorprovince"] = orStateValue; contactUpdate["address1_country"] = usaCountryValue; serviceClient.Update(contactUpdate);
3. 更简洁的方式:使用早期绑定类
如果项目启用了Dataverse早期绑定(通过CrmSvcUtil生成实体类),可以直接用枚举值赋值,避免手动查找ID:
var contactUpdate = retrievedContact.Entities[0].ToEntity<Contact>(); contactUpdate.Address1_StateOrProvince = new OptionSetValue((int)StateProvince.Oregon); contactUpdate.Address1_Country = new OptionSetValue((int)Country.UnitedStates); serviceClient.Update(contactUpdate);
内容的提问来源于stack exchange,提问作者GaryProthero
相关产品推荐
相关产品推荐

