我在 Opportunity 和自定义实体之间创建了(多对多)关系。CRM 自动打破与称为“相交表”的内置表的关系。
在插件注册工具中,我想在这个特定的表上添加创建/更新/删除消息。但问题是它在那里不存在——甚至多对多的系统关系也不存在在那里。
人们可能会建议我手动断开关系以便在注册工具中显示。但是有什么解决方案可以访问这个内置表吗?
我在 Opportunity 和自定义实体之间创建了(多对多)关系。CRM 自动打破与称为“相交表”的内置表的关系。
在插件注册工具中,我想在这个特定的表上添加创建/更新/删除消息。但问题是它在那里不存在——甚至多对多的系统关系也不存在在那里。
人们可能会建议我手动断开关系以便在注册工具中显示。但是有什么解决方案可以访问这个内置表吗?
不幸的是,答案是否定的。CRM 中关于多对多表/关系的范例是它们可用于Association
和Disassociation
请求,但不能用于Create
、Update
或Delete
请求。(事实上,Update
在交集表上没有实数 - 新的关联只会产生(Create
=> Associate
)或解散(Delete
=> Disassociate
)。)
您可以通过查看交集实体以某种方式验证这一点AttributeMetadata
,您会看到实体中的所有属性都具有字段ValidForUpdateAPI
并ValidForCreateAPI
设置为 false。这与常规实体不同,常规实体具有对 update 和 create 调用有效的混合属性。
为了解决您的问题,您的选择是有限的:
Association
1) 根据消息注册您的步骤。不幸的是,此消息无法过滤到特定实体,因此您必须过滤通过此插件在 CRM 中发出的所有关联请求。在属性包IPluginExecutionContext
中有一个名为“Relationship”的InputParameters
属性,您可以使用它来过滤出要为其开发代码的关系。
Relationship entityRelationship =
(Relationship)context.InputParameters["Relationship"];
if (entityRelationship.SchemaName = customIntersectTable.EntityLogicalName)
{
EntityReference targetEntity =
(EntityReference)context.InputParameters["Target"];
EntityReferenceCollection relatedEntities =
(EntityReferenceCollection)context.InputParameters["RelatedEntities"];
//do stuff
}
2) 制作一个与您的自定义实体具有一对多关系的自定义相交实体Opportunity
(类似于OpporunityProduct
将机会与产品联系起来的东西)。这里的缺点是这种东西的 GUI 并不像简单的交叉实体那样好。
Gonzalo Ruiz在 MSDN上也有关于这个主题的博客。他几乎说同样的话。