在使用Microsoft.Xrm.Sdk
命名空间一年后,我昨天才发现该Entity.FormattedValues
属性包含实体特定(即本地)选项集文本的文本值。
我之前没有发现它的原因是没有早期绑定的方法来获取价值。ieentity.new_myOptionSet
是OptionSetValue
只包含int
值的类型。您必须调用 entity.FormattedValues["new_myoptionset"] 来string
获取OptionSetValue
.
因此,我想让 crmsrvcutil 为本地选项集自动生成一个文本属性。即随着Entity.new_myOptionSet
它当前的生成,Entity.new_myOptionSetText
也会生成。
我查看了Microsoft.Crm.Services.Utility.ICodeGenerationService,但这看起来主要是为了指定CodeGenerationType
应该是什么......
有没有一种方法支持使用 CrmServiceUtil 添加这些属性,或者我最好编写一个我可以运行的自定义应用程序,它可以将这些属性作为自动生成的部分类生成?
编辑 - 我想生成的代码示例
目前,每当我需要访问 OptionSetValue 的文本值时,我都会使用以下代码:
var textValue = OptionSetCache.GetText(service, entity, e => e.New_MyOptionSet);
选项集缓存将使用entity.LogicalName
, 和属性表达式来确定我要求的选项集的名称。然后,它将使用 , 查询 SDK RetrieveAttriubteRequest
,以获取选项集 int 和文本值的列表,然后将其缓存,因此不必再次访问 CRM。然后它查找New_MyOptionSet
实体的 int 值并将其与缓存列表交叉引用,以获取 OptionSet 的文本值。
而不是做所有这些,我可以这样做(假设实体已从服务器检索,而不仅仅是填充客户端):
var textValue = entity.FormattedValues["new_myoptionset"];
但“new_myoptionset”不再是早期绑定。我希望生成的早期绑定实体类也为调用上述行的 OptionSetValue 属性生成一个额外的“文本”属性,因此我的实体会将其添加到其中:
public string New_MyOptionSetText {
return this.GetFormattedAttributeValue("new_myoptionset"); // this is a protected method on the Entity class itself...
}