【发布时间】:2016-05-11 15:42:41
【问题描述】:
我正在为 Dynamics CRM 2011 (On Prem) 编写 C# 插件。
该插件是为了防止帐户记录中的祖父关系(帐户可以有孩子或父母,但不能同时拥有)。
我正在努力检查帐户是否有关联的父级,父级 ID 的属性始终为空,我不明白为什么。
我已经使用crmsvcutil.exe 正确生成了早期绑定类并将文件添加到我的项目中。
为父 ID 生成的代码如下所示:
/// <summary>
/// Unique identifier of the parent account.
/// </summary>
[Microsoft.Xrm.Sdk.AttributeLogicalNameAttribute("parentaccountid")]
public Microsoft.Xrm.Sdk.EntityReference ParentAccountId
{
get
{
return this.GetAttributeValue<Microsoft.Xrm.Sdk.EntityReference>("parentaccountid");
}
set
{
this.OnPropertyChanging("ParentAccountId");
this.SetAttributeValue("parentaccountid", value);
this.OnPropertyChanged("ParentAccountId");
}
}
我的插件的基本版本如下所示:
namespace NoGrandparentAccounts
{
using CRM2011GeneratedBusinessModel; // Namespace for crmsvcutil generated early bound classes
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.ServiceModel;
public class Main : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
// OBTAIN EXECUTION CONTEXT
var context(IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
// TRACING SERVICE FOR LOGGING
var tracingService =
(ITracingService)serviceProvider.GetService(typeof(ITracingService));
// WILL REPRESENT THE CURRENT ENTITY
Entity entity = null;
// INPUTPARAMETERS COLLECTION CONTAINS ALL DATA PASSED IN THE MESSAGE REQUEST
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
// SET ENTITY TO THE CURRENT ENTITY
entity = (Entity)context.InputParameters["Target"];
// CHECK WE'RE IN ACCOUNTS ENTITY
if (context.PrimaryEntityName != "account")
return;
// CHECK WE'RE CREATING OR UPDATING THE ENTITY
if (context.MessageName != "Create" && context.MessageName != "Update")
return;
}
else
{
return;
}
try
{
// GET ORGANIZATION SERVICE
var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
var service = serviceFactory.CreateOrganizationService(context.UserId);
// GET CURRENT ACCOUNT
var account = entity.ToEntity<Account>();
// HAS A PARENT ACCOUNT?
var hasParent = (account.ParentAccountId != null && account.ParentAccountId.Id != Guid.Empty);
}
catch (FaultException<OrganizationServiceFault> ex)
{
tracingService.Trace($@"Exception: {ex.Message} - {ex.StackTrace}");
throw new InvalidPluginExecutionException(@"An error occurred in the plugin.", ex);
}
catch (Exception ex)
{
tracingService.Trace($@"Exception: {ex.Message} - {ex.StackTrace}");
throw new InvalidPluginExecutionException(@"An error occurred in the plugin.", ex);
}
}
}
}
不幸的是,hasParent 始终为 false,因为 account.ParentAccountId 为空。我不知道为什么,因为这条记录肯定有一个父帐户关联,并且属性名称肯定是parentaccountid。
使用parentaccountid 调用查找子帐户可以正常工作:
// FETCH CHILDREN
var cExpr = new ConditionExpression("parentaccountid", ConditionOperator.Equal, account.Id);
var qExpr = new QueryExpression(Account.EntityLogicalName);
qExpr.ColumnSet = new ColumnSet(new string[] { "accountid" });
qExpr.Criteria.AddCondition(cExpr);
var results = service.RetrieveMultiple(qExpr);
// HAS CHILDREN
var hasChildren = results.Entities.Count > 0;
实体计数正确显示为 3,因此 hasChildren 为真。
我检查了该实体的属性是否包含 parentaccountid 并且它返回 false,我认为这与问题有关:
if (entity.Attributes.Contains("parentaccountid"))
{
// Never gets here as this is false!?
}
我做错了什么?
【问题讨论】:
标签: c# plugins dynamics-crm-2011