Microsoft CRM Web服务 - LookupAttribute元数据(一对多或一对一)

时间:2015-09-17 09:20:19

标签: dynamics-crm-2011 crm generic-programming

我需要从Microsoft CRM 2011系统创建一个通用导出器/导入器,但我无法确定LookupAttribute是一对一还是一对多关系。

E.x。 我有一个名为“电子邮件”的实体。

电子邮件可以有一个“From”(这是一个查找属性,可以查找多个其他实体列表)

它可以有多个“To”(也可以作为查找属性引用到多个实体列表中)。

我刚刚提出的结论是我通过使用MS CRM的门户网站找到的东西。我无法找到任何方式来查看这些实体或属性的元数据,如果它是一对一或多对多的关系。

https://msdn.microsoft.com/en-us/library/gg509035.aspx#BKMK_CreateLookupAttribute

我看过这个关于如何建立这种关系的例子,但它还没有让我更进一步。

有没有人对MS CRM 2011的通用导出/导入有任何经验可以帮助我?

1 个答案:

答案 0 :(得分:3)

CRM有两种类型的关系:

  • 一对多:一个实体的查找,另一个实体的网格。
  • 多对多:两个实体上的网格。

没有一对一的关系。你正在寻找一个查找。您看到的90%的查找都很简单,您可以选择一个实体类型的一条记录。

但是,有一些特殊的系统字段查找,名为活动方。这些水浑浊一点。某些活动方查找允许多个记录选择,一些链接到多个类型的实体。这意味着您可以使用多个实体类型的多个记录进行活动方查找。我想你可以称之为“许多(实体)的一对多(记录)”。

例如在电子邮件中; To字段可以填充多个帐户和联系人记录。虽然From字段只能有一条记录,但可以是系统用户或队列。 ToFrom都是活动方查找的示例。

因此,就您要做的事情而言,您需要检查: AttributeMetadata.AttributeType看看它是否是一个派对列表。 LookupAttributeMetadata.Targets查看查找中允许的记录类型。

以下代码显示了如何针对几个不同的字段执行此操作。

RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest
{
    EntityLogicalName = "email",
    LogicalName = "to",
    RetrieveAsIfPublished = true
};

RetrieveAttributeResponse result = Service.Execute(attributeRequest) as RetrieveAttributeResponse;

Trace.WriteLine("Email - To");
Trace.WriteLine("AttributeMetadata.AttributeType: " + result.AttributeMetadata.AttributeType);
Trace.WriteLine("LookupAttributeMetadata.Targets: " + ((LookupAttributeMetadata)result.AttributeMetadata).Targets.CollectionToString(", "));

attributeRequest = new RetrieveAttributeRequest
{
    EntityLogicalName = "email",
    LogicalName = "from",
    RetrieveAsIfPublished = true
};

result = Service.Execute(attributeRequest) as RetrieveAttributeResponse;

Trace.WriteLine("Email - From");
Trace.WriteLine("AttributeMetadata.AttributeType: " + result.AttributeMetadata.AttributeType);
Trace.WriteLine("LookupAttributeMetadata.Targets: " + ((LookupAttributeMetadata)result.AttributeMetadata).Targets.CollectionToString(", "));

attributeRequest = new RetrieveAttributeRequest
{
    EntityLogicalName = "account",
    LogicalName = "parentaccountid",
    RetrieveAsIfPublished = true
};

result = Service.Execute(attributeRequest) as RetrieveAttributeResponse;

Trace.WriteLine("Account - Parent Account Id");
Trace.WriteLine("AttributeMetadata.AttributeType: " + result.AttributeMetadata.AttributeType);
Trace.WriteLine("LookupAttributeMetadata.Targets: " + ((LookupAttributeMetadata)result.AttributeMetadata).Targets.CollectionToString(", "));

输出:

Email - To
AttributeMetadata.AttributeType: PartyList
LookupAttributeMetadata.Targets: account, contact, lead, queue, systemuser

Email - From
AttributeMetadata.AttributeType: PartyList
LookupAttributeMetadata.Targets: queue, systemuser

Account - Parent Account Id
AttributeMetadata.AttributeType: Lookup
LookupAttributeMetadata.Targets: account