我们的帐户实体与'BookingAccount'(自定义实体)有1:N的关系。关系的名称是new_Account_new_BookingAccount。在插件中,如果我尝试迭代集合
foreach (new_BookingAccount ba in myAccount.new_Account_newBookingAccount)
{
...
}
它是空的 - 即使有相关的BookingAccounts。
我应该重新查询BookingAccounts还是可以在集合属性上调用一些'populate'方法?如果是这样,最好的方法是什么?如果你不能迭代它,那么集合属性的重点是什么。
感谢您提前提供任何帮助。
答案 0 :(得分: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
的。你提到这个代码是在插件里面使用的。但是你没有提到它是什么样的插件(前期,后期),你在这个插件中处理了什么样的消息,你怎么样?检索实体myAccount
的实例。如果直接调用retrieve方法,则应填充所有属性。但如果myAccount
来自输入参数,则无法保证将为所有属性设置所有实际值。可能是这个集合为空的原因。
答案 1 :(得分:1)
啊 - 需要明确加载集合:
orgContext.LoadProperty(account, "new_BookingAccount_new_ExternalCode");
foreach (new_BookingAccount ba in myAccount.new_Account_new_BookingAccount)
{
...
}
(虽然如果accouont是一个新实体,这是不可能的,所以事先需要进行某种检查):
if (account.CreatedOn == null)
return;
对于简单的集合迭代来说似乎很多工作