2013-03-14 42 views
1

在我的工作流程中插入或刪除聯繫人表單作爲市場營銷列表。根據輸入的布爾參數值。 道道通>插入 - >如果接觸存在 然後返回 - 其他> 假 - >刪除 - >如果不存在 然後返回工作流上下文System.NullReferenceException

這WFA事件上運行。

第一次觸發時,它運行良好,刪除或添加聯繫人。但是,我重新運行改變布爾值,我得到下面的異常消息:

Workflow paused due to error: Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object. at ContactToMList.ContactToMList.Execute(CodeActivityContext executionContext) at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor

executor, BookmarkManager bookmarkManager, Location resultLocation)

這似乎是開不走的上下文。

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); 

      } 

     } 
    } 
} 
+1

看起來像一個代碼錯誤;-)你可以發佈代碼? –

+0

當然。我已經發布了! :) – user1200566

+0

有很多地方這可能來自。每當你使用Linq表達式時,你都認爲你會得到一個結果;然後(假設你有結果)嘗試訪問結果的成員。這在上面的代碼中發生了幾次。好消息是,您可以通過調試代碼來證明這一點。另外,你的代碼看起來很像我在另一個線程中回答的問題 –

回答

1

這是我用來與我的組織服務代理進行交互的一些代碼。我覺得在不通過UI的情況下觸發插件很有幫助。這對於清理在開發插件時損壞的數據也很有幫助。

您需要填寫自己的域名,用戶名,密碼和組織名稱。註釋掉的代碼是我用來填充一系列相關實體的東西。讓我知道你是否需要更多的幫助。

如果我有TrainingContext,您將用CRM SDK中使用CrmSvcUtil生成的上下文替換它。

CrmConnection connection = CrmConnection.Parse("Url=http://localhost/trainingorg1; Domain=; Username=; Password=;"); 
OrganizationService service = new OrganizationService(connection); 
string template = "http://localhost/main.aspx?etn={0}&pagetype=entityrecord&id=%7B{1}%7D"; 

using (TrainingContext svc = new TrainingContext(service)) 
{ 
    svc.MergeOption = Microsoft.Xrm.Sdk.Client.MergeOption.NoTracking; 

    training_customer customer = svc.training_customerSet.FirstOrDefault(c => c.training_name == "George.Lucas"); 
    customer.training_SocialSecurityNumber = "123-45-6789"; 
    svc.Update(customer); 

      #region interaction activity 
      //try 
      //{ 
      // training_customer customer = new training_customer 
      //  { 
      //   EmailAddress = "[email protected]", 
      //   training_name = "George.Lucas", 
      //   training_UniqueCustomerIdentifier = "George.Lucas" 
      //  }; 
      // customer.Id = svc.Create(customer); 

      // training_interactiontypemaster typeMaster = new training_interactiontypemaster 
      // { 
      //  training_Description = "Indicates an Interaction initiated because a Customer needed to update an Address", 
      //  training_InteractionTypeValue = "Address Update" 
      // }; 
      // typeMaster.Id = svc.Create(typeMaster); 

      // training_interaction interaction = new training_interaction 
      // { 
      //  training_name = "Command Prompt", 
      //  training_Customer = customer.ToEntityReference(), 
      //  training_Description = typeMaster.training_Description, 
      //  training_InteractionType = typeMaster.ToEntityReference() 
      // }; 

      // interaction.Id = svc.Create(interaction); 
      // EntityReference reference = interaction.ToEntityReference(); 
      // customer.training_Interaction = reference; 
      // svc.Update(customer); 

      // training_interactionactivity activity = new training_interactionactivity 
      // { 
      //  training_ActivityName = "Customer Update", 
      //  training_Description = "Updating Customer: " + customer.training_name, 
      //  training_Interaction = reference, 
      //  training_Entity = string.Format(template, customer.LogicalName, customer.Id) 
      // }; 
      // activity[customer.LogicalName] = customer.ToEntityReference(); 
      // svc.Create(activity); 

      // training_address address = new training_address 
      // { 
      //  training_City = "City", 
      //  training_Country = "Country", 
      //  training_County = "County", 
      //  training_Interaction = reference, 
      //  training_Street1 = "Street 1", 
      //  training_Street2 = "Street 2" 
      // }; 
      // address.Id = svc.Create(address); 

      // training_interactionactivity activityTwo = new training_interactionactivity 
      // { 
      //  training_Address = address.ToEntityReference(), 
      //  training_ActivityName = "Address Update", 
      //  training_Description = "Updating the Address for Customer: " + customer.training_name, 
      //  training_Interaction = reference, 
      //  training_Entity = string.Format(template, address.LogicalName, address.Id) 
      // }; 
      // //activityTwo[address.LogicalName] = new CrmEntityReference(training_address.EntityLogicalName, addressId); 
      // svc.Create(activityTwo); 
      //} 
      //catch (Exception e) 
      //{ 
      // Console.WriteLine(e.ToString()); 
      //} 
      #endregion 
}