2

我们的 Account 实体与自定义实体“BookingAccount”具有 1:N 关系。关系的名称是 new_Account_new_BookingAccount。在插件中,如果我尝试迭代集合

foreach (new_BookingAccount ba in myAccount.new_Account_newBookingAccount)
{
    ...
}

它为空 - 即使存在相关的 BookingAccounts。

我应该重新查询 BookingAccounts 还是可以在集合属性上调用一些“填充”方法?如果是这样,最好的方法是如何做到这一点?如果你不能迭代它,集合属性的意义何在。

感谢您提前提供任何帮助。

4

2 回答 2

1

您的代码应该可以工作。如果您将使用早期绑定的实体类编写客户端,您将看到此类集合利用通用GetRelatedEntity方法。代码将如下所示:

        /// <summary>
        /// 1:N account_activity_parties
        /// </summary>
        [Microsoft.Xrm.Sdk.RelationshipSchemaNameAttribute("account_activity_parties")]
        public System.Collections.Generic.IEnumerable<MyCrmNamespace.ActivityParty> account_activity_parties
        {
            get
            {
                return this.GetRelatedEntities<MyCrmNamespace.ActivityParty>("account_activity_parties", null);
            }
            ...
        }

此代码应该在所有情况下都能正常工作。当然,可能存在一些安全问题。您的代码在某些 CRM 用户凭据下执行,您应该确保用户有足够的权限来浏览这两个实体。
但最重要的是你应该注意的是你如何检索实例myAccount。你提到这段代码是在插件内部使用的。但是你没有提到它是什么样的插件(pre-stage,post-stage),你在这个插件中处理什么样的消息,你是怎么做的检索实体的实例myAccount。如果直接调用检索方法,则应填充所有属性。但如果myAccount来自输入参数,不能保证将为所有属性设置所有实际值。可能是集合为空的原因。

于 2012-04-17T11:45:15.267 回答
1

Ah - the collection needs to be loaded explicitly:

orgContext.LoadProperty(account, "new_BookingAccount_new_ExternalCode");
foreach (new_BookingAccount ba in myAccount.new_Account_new_BookingAccount)
{
    ...
}

(Though this can't be done if the accouont is a new entity, so needs some sort of check beforehand):

if (account.CreatedOn == null)
    return;

Seems like a lot of work for simple collection iteration

于 2012-04-19T02:06:10.297 回答