创建子网格记录上的Dynamics 365重复检测插件



希望有人能帮助我,我已经为此挣扎了几个小时了。

我正在创建一个插件,在EntityA记录(案例(的子网格上创建一个名为Future Products(entity B(的自定义实体记录。

EntityA是与自定义EntityB具有1:N关系的Case。实体B与实体C(产品类别(也存在M:1关系。

总共有3个实体,Case、Future Products和最后一个Product Category。

我的插件是在创建EntityB时注册的,它有多对一的情况(实体A(。

插件需要检测添加到案例(实体A(中的子网格中的重复记录,然而,这些记录位于实体B(未来的产品(中。

我的挑战是,EntityB有一个名为product category的字段,这是对EntityC的查找,我想比较用户正在添加到Case上已经存在的列表中的上下文中的值,如果存在与相同查找名称匹配的值,则抛出一个新错误,说它检测到添加了重复记录。

我的代码不起作用,添加任何产品类别时都会出现异常,而不是在找到的重复项上。

参见下面的c#插件代码

// The InputParameters collection contains all the data passed in the message request.  
if (context.InputParameters.Contains("Target") &&
context.InputParameters["Target"] is Entity)
{
// Obtain the target entity from the input parameters.  
Entity entity = (Entity)context.InputParameters["Target"];
// Obtain the organization service reference which you will need for  
// web service calls.  
IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService organizationService = serviceFactory.CreateOrganizationService(context.UserId);

try
{
if (entity.Contains("mm_application"))
{
tracingService.Trace($"Application Case- {(EntityReference)entity["mm_application"]}");
var query = new QueryExpression("mm_futureproductcategories");
query.ColumnSet.AddColumns("mm_application", "mm_productcategory");

//Get contect Entity ID
Entity futureProductRecord = organizationService.Retrieve(entity.LogicalName, entity.Id, new ColumnSet(true));
//Get Related Case application lookup
EntityReference relatedCase = futureProductRecord.GetAttributeValue<EntityReference>("mm_application");
Entity caseRecord = organizationService.Retrieve("incident", relatedCase.Id, new ColumnSet(true));
//Get Related Product Category lookup
EntityReference relatedProductCategory = futureProductRecord.GetAttributeValue<EntityReference>("mm_productcategory");
Entity productCategoryRecord = organizationService.Retrieve("mm_productcategory", relatedProductCategory.Id, new ColumnSet(true));

query.Criteria.AddCondition("mm_application", ConditionOperator.Equal, caseRecord.Id);
query.Criteria.AddCondition("mm_productcategory", ConditionOperator.Equal, productCategoryRecord.Id);
EntityCollection futureProductCatRecords = organizationService.RetrieveMultiple(query);
if (futureProductCatRecords.Entities.Count > 0)
{
throw new InvalidPluginExecutionException($"Duplicate Future Product Category detected.");
}


}
}

插件总是遇到异常,即使添加的Future Products Category还不在案例记录的子网格中。我可能错过了什么,如果可以的话,请帮帮我。我已经为此挣扎了一整天。

在更多谷歌搜索的帮助下,我终于弄清楚了,所以我上面的代码是不正确的,而且它是在Post Operation Create而不是Pre-Operation上运行的。

我通过从插件上下文中已经存在的实体中获取查找值来解决这个问题。请参阅我更新的代码,了解如何在创建子网格时检查重复项。

try
{
if (entity.Contains("mm_productcategory"))
{

tracingService.Trace($"Application Case- {(EntityReference)entity["mm_application"]}");
// Instantiate QueryExpression query
var query = new QueryExpression("mm_futureproductcategories");
// Add columns to query.ColumnSet
query.ColumnSet.AddColumns("mm_application", "mm_productcategory");
// Define filter query.Criteria
if (entity.Contains("mm_productcategory"))
{
tracingService.Trace($"Application Case- {(EntityReference)entity["mm_productcategory"]}");
query.Criteria.AddCondition("mm_productcategory", ConditionOperator.Equal, entity.GetAttributeValue<EntityReference>("mm_productcategory").Id);
}
if (entity.Contains("mm_application"))
{
query.Criteria.AddCondition("mm_application", ConditionOperator.Equal, entity.GetAttributeValue<EntityReference>("mm_application").Id);
}

EntityCollection futureProductCatRecords = organizationService.RetrieveMultiple(query);
if (futureProductCatRecords.Entities.Count > 0)
{
throw new InvalidPluginExecutionException($"Duplicate Future Product Category detected.");
}

}
}

此代码将检查是否有任何重复的Future Products,如果发现则抛出异常。

要使其工作,您需要检查是否未返回当前记录。

您需要添加以下行:

query.Criteria.AddCondition(mm_futureproductcategories, ConditionOperator.NotEqual, futureProductRecord.Id);

或者你可以把你的最终条件改为:

if (futureProductCarRecords.Entities.Count > 1){}

最新更新