如何为实体特定(即本地)选项集文本值自动生成早期绑定属性?

时间:2012-11-01 13:39:46

标签: dynamics-crm-2011 dynamics-crm

在使用Microsoft.Xrm.Sdk命名空间一年后,我刚刚发现Entity.FormattedValues属性包含实体特定(即本地)选项集文本的文本值。

之前我没有发现它的原因是,没有获得价值的早期约束方法。即entity.new_myOptionSet属于OptionSetValue类型,仅包含int值。您必须调用entity.FormattedValues [“new_myoptionset”]以获取string的{​​{1}}文本值。

因此,我想让crmsrvcutil自动生成本地选项集的文本属性。即,除了当前生成OptionSetValue之外,还会生成Entity.new_myOptionSet

我查看了Microsoft.Crm.Services.Utility.ICodeGenerationService,但看起来主要用于指定Entity.new_myOptionSetText应该是什么......

使用CrmServiceUtil添加这些属性是否有一种支持方式,或者我最好编写一个我可以运行的自定义应用程序,它可以将这些属性生成为自动生成的属性的部分类?

编辑 - 我想要生成的代码示例

目前,每当我需要访问OptionSetValue的文本值时,我都会使用以下代码:

CodeGenerationType

选项集缓存将使用var textValue = OptionSetCache.GetText(service, entity, e => e.New_MyOptionSet); 和属性表达式来确定我要求的选项集的名称。然后,它将使用entity.LogicalName查询SDK,以获取选项set int和text值的列表,然后将其缓存,以便不必再次访问CRM。然后,它查找实体的RetrieveAttriubteRequest的int值,并将其与缓存列表交叉引用,以获取OptionSet的文本值。

我可以这样做(假设已从服务器检索实体,而不只是填充客户端),而不是完成所有这些操作:

New_MyOptionSet

但是“new_myoptionset”不再是早期约束。我希望生成的早期绑定实体类也为调用上面一行的OptionSetValue属性生成一个额外的“Text”属性,所以我的实体会添加它:

var textValue = entity.FormattedValues["new_myoptionset"];

3 个答案:

答案 0 :(得分:0)

您是否可以利用CrmServiceUtil扩展程序为您的OptionSet生成枚举,然后将new_myOptionSetText属性添加到将int值与枚举进行比较的部分类和returns the enum string

答案 1 :(得分:0)

同样,我认为特别针对这种情况,让CrmSvcUtil.exe生成您想要的代码是一个好主意,但更一般地说,您可以使用类似于接受的答案的方法通过反射访问属性名称@ workarounds for nameof() operator in C#: typesafe databinding

var textValue = entity.FormattedValues["new_myoptionset"];
// becomes
var textValue = entity.FormattedValues
[
    // renamed the class from Nameof to NameOf
    NameOf(Xrm.MyEntity).Property(x => x.new_MyOptionSet).ToLower()
];

答案 2 :(得分:0)

最新版本的CRM Early Bound Generator包含一个包含字段名称的Fields结构。这允许访问FormattedValues就像这样简单:

var textValue = entity.FormattedValues[MyEntity.Fields.new_MyOptionSet];

您可以通过CrmSvcUtil的界面创建一个新属性,但这对于一个相当简单的调用来说有很多工作要做,而且我认为它不足以创建其他属性。