【发布时间】:2013-03-14 13:24:40
【问题描述】:
在我的工作流程中,从营销列表中插入或删除联系人。根据输入的布尔参数值。 真-> 插入 -> 如果联系人存在 然后返回 -> 其他 错误 -> 删除 -> 如果不存在 然后返回
此 WFA 在事件上运行。
第一次触发时,它运行良好,删除或添加联系人。但是我重新运行更改布尔值,我得到以下异常消息:
工作流程因错误而暂停:未处理的异常: System.NullReferenceException:对象引用未设置为实例 的一个对象。在 ContactToMList.ContactToMList.Execute(CodeActivityContext 执行上下文)在 System.Activity.CodeActivity.InternalExecute(ActivityInstance 实例,ActivityExecutor 执行器,BookmarkManager 书签管理器) 在 System.Activity.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor
执行者、BookmarkManager、bookmarkManager、位置结果Location)
似乎没有考虑上下文。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
using System.Activities;
using ContactToMList;
namespace ContactToMList
{
public class ContactToMList : CodeActivity
{
[Input("Contatto")]
[ReferenceTarget("contact")]
public InArgument<EntityReference> contact { get; set; }
[Input("Marketing List")]
[ReferenceTarget("list")]
public InArgument<EntityReference> MList { get; set; }
[Input("Inserimento")]
public InArgument<bool> inserimento { get; set; }
bool action = false;
private static string _logs = string.Empty;
private static IOrganizationService myService = null;
private static string _separataore = "\r\n";
private static Log_Entity log = new Log_Entity(string.Empty, myService);
protected override void Execute(CodeActivityContext executionContext)
{
try
{
ITracingService tracingService = executionContext.GetExtension<ITracingService>();
// Create the context
IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
// Create the Organiztion service
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
myService = service;
log.WriteLog("");
// Get the target entity from the context
// var target = context.InputParameters["EntityId"];
Guid contactiId = contact.Get<EntityReference>(executionContext).Id;
Guid ListId = MList.Get<EntityReference>(executionContext).Id;
bool insert = inserimento.Get<bool>(executionContext);
// Prepare DataContext by using AutoGenerated cs file
XrmDataContext datacontext = new XrmDataContext(service);
var MyContact = (from c in datacontext.ContactSet where c.ContactId == contactiId select c.Id).ToArray();
var MyList = (from l in datacontext.ListSet where l.Id == ListId select l).ToList().FirstOrDefault();
// tutti i membri della lista di marketing
var members = (from m in datacontext.ListMemberSet where m.ListId.Id == MyList.ListId select m.EntityId.Id).ToArray();
if (MyList.MemberType == 2)
{
if (MyList.Type.Value == false)
{
foreach (Guid id in members)
if (MyContact.FirstOrDefault() == id)
action = true;
if (insert && !action)
{
AddListMembersListRequest AddMemberRequest = new AddListMembersListRequest();
AddMemberRequest.ListId = ListId;
AddMemberRequest.MemberIds = MyContact;
// Use AddListMembersListReponse to get information about the request execution
AddListMembersListResponse AddMemberResponse = service.Execute(AddMemberRequest) as AddListMembersListResponse;
//service.Update(MyList);
}
else if (!insert && action)
{
RemoveMemberListRequest RemoveMemberRequest = new RemoveMemberListRequest();
RemoveMemberRequest.ListId = ListId;
RemoveMemberRequest.EntityId = MyContact.FirstOrDefault();
// Use AddListMembersListReponse to get information about the request execution
RemoveMemberListResponse RemoveMemberResponse = service.Execute(RemoveMemberRequest) as RemoveMemberListResponse;
// service.Update(MyList);
}
}
else
{
tracingService.Trace("Stai cercando di inserire un contatto in una lista di Marketing che non è statica.");
_logs += "Stai cercando di inserire un contatto in una lista di Marketing che non è statica." + _separataore;
return;
}
}
else
{
tracingService.Trace("Stai cercando di inserire un enittà diversa da un contatto.");
_logs += "Stai cercando di inserire un enittà diversa da un contatto." + _separataore;
return;
}
}
catch (Exception ex)
{
log.WriteLog(ex.Message);
}
}
}
}
【问题讨论】:
-
看起来像代码错误 ;-) 你能发布代码吗?
-
当然。我已经发布了! :)
-
这可能来自很多地方。每次你使用 Linq 表达式时,你都假设你会得到一个结果;然后(假设您有结果)尝试访问结果的成员。这在上面的代码中发生了几次。好消息是,您可以通过调试代码来证明这一点。此外,您的代码看起来很像我在另一个线程中回答的问题
-
对不起,请问有什么问题吗?是的,WF 活动和插件是不同的;是的,WF 只是异步的。就个人而言,我更喜欢将插件用于我的业务逻辑,因为我不希望它们临时运行,我确实希望它们同步,并且我希望能够利用实体图像(有时)。
-
我必须调试你的代码,看看在成功和失败的情况下会发生什么。您知道如何使用 CrmConnection 制作控制台应用程序来调用您的组织代理吗?我会尝试将此代码转换为控制台应用程序,然后针对成功和失败情况运行它,看看我是否看到了不同的东西。如果这听起来像是您想尝试但不确定如何做的事情,请告诉我。否则,我看不出有什么突出我=/
标签: dynamics-crm-2011 dynamics-crm