c# - dynamics crm 在线插件 - 使用字段值填充相关实体的属性
c# - dynamics crm online plugin - use field value to populate attribute of related entity
我是 c# 和动态插件的新手。为了学习和测试,我成功地创建了几个非常简单的插件。现在,我正在尝试更多地了解我实际需要使用插件做什么——我正在尝试获取自定义实体上字段的值,并使用该值更新相关自定义上的属性实体。
我的插件在自定义实体(称为 new_registration)的更新消息上注册。它异步运行 post-operation。更新和触发插件的字段(一个选项集 "Status" 字段)没有在代码中的任何地方使用。
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
namespace PlugInTests
{
public class AdjustTimeSlots: IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
//Extract the tracing service for use in debugging sandboxed plug-ins.
ITracingService tracingService =
(ITracingService)serviceProvider.GetService(typeof(ITracingService));
// Obtain the execution context from the service provider.
IPluginExecutionContext context = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext));
if (context.InputParameters != null)
{
Entity entity = (Entity)context.InputParameters["Target"];
Guid id = entity.Id;
tracingService.Trace("got input parameters");
//get time slot
string slot = (string)entity.Attributes["new_yourtimeslot"];
EntityReference eventclass = (EntityReference)entity.Attributes["new_eventregistrationrelationshipid"];
tracingService.Trace("got time slot");
//set updated entity (event/class)
Entity parentevent = new Entity("new_eventclass");
parentevent.Id = eventclass.Id;
parentevent.Attributes["new_timeslotsfordelete"] = slot;
// Obtain the organization service reference.
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
//update event record
tracingService.Trace("Update time slot plugin");
service.Update(parentevent);
}
}
}
}
通过测试,我缩小了这一行失败的范围(至少最初是这样):
string slot = (string)entity.Attributes["new_yourtimeslot"];
我在插件跟踪日志中遇到的错误是:
The given key was not present in the dictionary.
我已经反复检查过,我知道我得到的字段名称是正确的。我从输入参数中获取值的方式有问题吗?还是我搞砸了我什至没有意识到我可能搞砸了?感谢您的帮助,谢谢。
始终尝试以安全的方式获取属性值(检查属性集合中的属性或使用如下所示的 SDK 方法)。如果属性值为 null,则该属性不会作为属性集合的一部分返回。
var slot = entity.GetAttributeValue<string>("new_yourtimeslot");
以下代码片段看起来不正确
EntityReference eventclass = (EntityReference)entity.Attributes["new_eventregistrationrelationshipid"];
属性名称和关系名称很少相同。关系名称通常包括目标实体和相关实体,并且大多数情况下,最终成为查找的属性的命名方式可能不同 new_eventregistrationid
?通过查看 Customization
- Field Properties
.
仔细检查名称
另外,安全获取相关属性:
var eventclass = entity.GetAttributeValue<EntityReference>("new_eventregistrationid");
我是 c# 和动态插件的新手。为了学习和测试,我成功地创建了几个非常简单的插件。现在,我正在尝试更多地了解我实际需要使用插件做什么——我正在尝试获取自定义实体上字段的值,并使用该值更新相关自定义上的属性实体。
我的插件在自定义实体(称为 new_registration)的更新消息上注册。它异步运行 post-operation。更新和触发插件的字段(一个选项集 "Status" 字段)没有在代码中的任何地方使用。
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
namespace PlugInTests
{
public class AdjustTimeSlots: IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
//Extract the tracing service for use in debugging sandboxed plug-ins.
ITracingService tracingService =
(ITracingService)serviceProvider.GetService(typeof(ITracingService));
// Obtain the execution context from the service provider.
IPluginExecutionContext context = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext));
if (context.InputParameters != null)
{
Entity entity = (Entity)context.InputParameters["Target"];
Guid id = entity.Id;
tracingService.Trace("got input parameters");
//get time slot
string slot = (string)entity.Attributes["new_yourtimeslot"];
EntityReference eventclass = (EntityReference)entity.Attributes["new_eventregistrationrelationshipid"];
tracingService.Trace("got time slot");
//set updated entity (event/class)
Entity parentevent = new Entity("new_eventclass");
parentevent.Id = eventclass.Id;
parentevent.Attributes["new_timeslotsfordelete"] = slot;
// Obtain the organization service reference.
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
//update event record
tracingService.Trace("Update time slot plugin");
service.Update(parentevent);
}
}
}
}
通过测试,我缩小了这一行失败的范围(至少最初是这样):
string slot = (string)entity.Attributes["new_yourtimeslot"];
我在插件跟踪日志中遇到的错误是:
The given key was not present in the dictionary.
我已经反复检查过,我知道我得到的字段名称是正确的。我从输入参数中获取值的方式有问题吗?还是我搞砸了我什至没有意识到我可能搞砸了?感谢您的帮助,谢谢。
始终尝试以安全的方式获取属性值(检查属性集合中的属性或使用如下所示的 SDK 方法)。如果属性值为 null,则该属性不会作为属性集合的一部分返回。
var slot = entity.GetAttributeValue<string>("new_yourtimeslot");
以下代码片段看起来不正确
EntityReference eventclass = (EntityReference)entity.Attributes["new_eventregistrationrelationshipid"];
属性名称和关系名称很少相同。关系名称通常包括目标实体和相关实体,并且大多数情况下,最终成为查找的属性的命名方式可能不同 new_eventregistrationid
?通过查看 Customization
- Field Properties
.
另外,安全获取相关属性:
var eventclass = entity.GetAttributeValue<EntityReference>("new_eventregistrationid");