我正在研究CRM Dynamics插件。自定义实体上有一个名为“email”的字段。我想确保两个实体记录的电子邮件地址应该是唯一的。为此我写了以下代码:
public class Class1 : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
// Obtain the execution context from the service provider.
Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
// Get a reference to the organization service.
IOrganizationServiceFactory factory =
(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = factory.CreateOrganizationService(context.UserId);
// The InputParameters collection contains all the data passed in the message request.
if (context.InputParameters.Contains("Target") &&
context.InputParameters["Target"] is Entity)
{
Entity entity = (Entity)context.InputParameters["Target"];
//</snippetAccountNumberPlugin2>
// Verify that the target entity represents an account.
// If not, this plug-in was not registered correctly.
if (context.MessageName.ToUpper() == "CREATE")
{
if (entity.LogicalName == "new_assignment1entity")
{
try
{
QueryExpression query = new QueryExpression("new_assignment1entity");
query.ColumnSet.AddColumns("new_email");
EntityCollection result1 = service.RetrieveMultiple(query);
foreach (var a in result1.Entities)
{
int size = result1.Entities.Count;
if (a.Attributes["new_email"].ToString().Equals(entity["new_email"]))
throw new InvalidPluginExecutionException("Duplicate Email found!");
}
}
catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>)
{
//You can handle an exception here or pass it back to the calling method.
throw new InvalidPluginExecutionException("Some problem occurred while Querying Records!");
}
}
}
else if (context.MessageName.ToUpper() == "UPDATE")
{
if (entity.LogicalName == "new_assignment1entity")
{
try
{
QueryExpression query = new QueryExpression("new_assignment1entity");
query.ColumnSet.AddColumns("new_email");
EntityCollection result1 = service.RetrieveMultiple(query);
foreach (var a in result1.Entities)
{
int size = result1.Entities.Count;
if (a.Attributes["new_email"].ToString().Equals(entity["new_email"]))
throw new InvalidPluginExecutionException("Duplicate Email found!");
}
}
catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>)
{
//You can handle an exception here or pass it back to the calling method.
throw new InvalidPluginExecutionException("Some problem occurred while Querying Records!");
}
}
}
}
}
}
当用户创建具有重复电子邮件地址的新实体记录时,此代码有效并显示对话框打印错误消息。但是,当用户编辑现有记录(更新和现有记录)并使电子邮件地址重复时,此代码不起作用,并且保存了重复电子邮件地址的更新记录。
我猜测带有UPDATE else部分的Context消息不起作用。
请帮帮我。
答案 0 :(得分:2)
尝试调试这个并不值得,但不幸的是,你正以极其低效的方式解决这个问题。 (尽管最可能的原因是您查询受CRM特征影响的方式,这意味着您不会查询您认为的所有记录)。
简而言之,您的代码说:
new_assignment1entity
实体的所有(*)实例主要观点:
new_assignment1entity
属性与提供的值匹配的new_email
条记录String.Equals(string)
区分大小写,以便真正检查重复项,您应该转换每个值的大小写size
变量没有用处new_email
的值,您的代码将抛出异常。您应该在尝试访问该属性之前检查该属性是否存在答案 1 :(得分:0)
我解决了这个问题。仅创建执行流程而不是更新的问题是我只注册了创建消息步骤的插件。为了解决这个问题,我在同一个插件中添加了一个新步骤并使用更新消息进行了注册,如下面的屏幕截图所示:
它就像魅力一样。
除此之外,@ GregOwens提到了非常有用的要点。这些应该是CRM开发中的最佳实践。