Dynamics crm System.NullReferenceException:对象未设置为对象的实例?

Dynamics crm System.NullReferenceException:对象未设置为对象的实例?,dynamics-crm,microsoft-dynamics,dynamics-365,Dynamics Crm,Microsoft Dynamics,Dynamics 365,我正在写一个插件,删除两个日期之间的记录时,合同被取消。。。要删除的记录从取消日期到合同结束。以下是我正在使用的代码: 使用系统; 使用System.Linq; 使用System.ServiceModel; 使用Microsoft.Xrm.Sdk; 使用Microsoft.Xrm.Sdk.Messages; 使用Microsoft.Xrm.Sdk.Query; /// ///此插件将在合同期限结束前取消合同后删除单位订单 /// 名称空间DCWIMS.Plugins { [CrmPlugin

我正在写一个插件,删除两个日期之间的记录时,合同被取消。。。要删除的记录从取消日期到合同结束。以下是我正在使用的代码:

使用系统;
使用System.Linq;
使用System.ServiceModel;
使用Microsoft.Xrm.Sdk;
使用Microsoft.Xrm.Sdk.Messages;
使用Microsoft.Xrm.Sdk.Query;
/// 
///此插件将在合同期限结束前取消合同后删除单位订单
/// 
名称空间DCWIMS.Plugins
{
[CrmPluginRegistration(MessageNameEnum.Update,
“合同”,
术后分期,
ExecutionModeEnum.Asynchronous,
“州代码”,
“取消合同后更新”,
1000,
隔离模式枚举沙箱,
Image1Name=“PreImage”,
Image1Type=ImageTypeEnum.PreImage,
Image1Attributes=“”)]
公共类单元插件NCEL:IPlugin
{
public void Execute(IServiceProvider服务提供程序)
{
//提取跟踪服务以用于调试沙盒插件。
//将注册此插件,因此需要添加与跟踪服务相关的代码。
ITracingService跟踪=(ITracingService)serviceProvider.GetService(类型(ITracingService));
//从服务提供程序获取执行上下文。
IPluginExecutionContext上下文=(IPluginExecutionContext)
GetService(typeof(IPluginExecutionContext));
//InputParameters集合包含消息请求中传递的所有数据。
if(context.InputParameters.Contains(“目标”)&&
context.InputParameters[“Target”]是实体)
{
实体=(实体)上下文。输入参数[“目标”];
//获取更新合同的前映像
实体前图像=context.PreEntityImages[“PreImage”];
//验证目标实体是否表示合同实体已被取消
if(entity.LogicalName!=“contract”| | entity.GetAttributeValue(“statecode”).Value!=4)
返回;
//获取web服务调用的组织服务。
I组织服务工厂服务工厂=
(IOOrganizationServiceFactory)服务提供者.GetService(类型为(IOOrganizationServiceFactory));
IOOrganizationService=serviceFactory.CreateOrganizationService(context.UserId);
//Try块中的核心插件代码
尝试
{
//获取合同行开始日期
var startDate=entity.GetAttributeValue(“取消”);
//获取合同行结束日期
DateTime endDate=(DateTime)前映像[“expireson”];
//将合同范围纳入工作日列表
Eachday范围=新的Eachday();
var weekdays=范围。WeekDay(开始日期、结束日期);
//获取单位订单查找Id
EntityReference unitOrder=(EntityReference)PreImage.Attributes[“new_unitorderid”];
var unitOrderId=unitOrder.Id;
var unitOrders=service.Retrieve(unitOrder.LogicalName,unitOrder.Id,new ColumnSet(“new_name”);
var uiName=unitOrders.GetAttributeValue(“新名称”);
//获取要删除的实体集合
字符串fetchXml=@”

我以前曾将此语句用于另一个作用于合同实体的插件,它工作正常,我不知道为什么这次它不工作。以下是此语句:

//验证目标实体是否表示合同实体已被取消
if(entity.LogicalName!=“contract”| | entity.GetAttributeValue(“statecode”).Value!=4)
返回;

从输入参数中获取的
实体可能没有StateCode,因此
.Value
失败

在取消引用
.Value
之前,可以尝试
entity.GetAttributeValue(“statecode”)或
entity.Contains(“statecode”)
查看是否有任何内容


由于您有
前映像
,您可能需要在那里查找
状态代码

检查您在调试时是否使用了正确的配置文件…如果您使用了错误的配置文件,则空引用将在不应该使用的方法上通过


希望有帮助!

但为什么它应该出现在前图像中?我在合同实体上注册了插件,并过滤了statecode。我写的最后一个插件也是以同样的方式注册的,我使用了完全相同的行。这是我第一次看到Sparkle的插件注册符号。非常酷。我注意到前图像有没有属性,所以这不在表中。当您在调试时查看
entity.GetAttributeValue(“statecode”)或
entity.Contains(“statecode”)
时,会得到什么?我得到一个空值!看起来像是忽略了一个小问题:)