2017-12-13 19 views
0

2 개의 사용자 정의 워크 플로우가 있습니다. 하나의 출력은 다른 출력에 대한 입력이됩니다. 내가 처음 사용자 지정 워크 플로를 호출하고 다른 단계에서의 출력을 사용하면Dynamics 365 + 사용자 정의 워크 플로우 + 엔티티 참조에는 ID 및 키 속성이 없습니다.

, 그것은 나에게 오류가 있습니다 : 1 워크 플로

'InValid Argument' error - Entity Reference cannot have Id and Key Attributes empty.

코드 -

public class RetrieveCaseForUnit : WorkFlowActivityBase 
{ 
    #region Input Parameters 
    [Input("Unit")] 
    [ReferenceTarget(msdyn_customerasset.EntityLogicalName)] 
    public InArgument<EntityReference> Unit { get; set; } 
    #endregion 

    #region Output Parameters 
    [Output("Case")] 
    [ReferenceTarget(Incident.EntityLogicalName)] 
    public OutArgument<EntityReference> Case{ get; set; } 
    #endregion 


    public override void ExecuteCRMWorkFlowActivity(CodeActivityContext executionContext, LocalWorkflowContext crmWorkflowContext) 
    { 
     try 
     { 

      if (crmWorkflowContext == null) 
      { 
       throw new ArgumentNullException("crmWorkflowContext is null"); 
      } 

      crmWorkflowContext.Trace("Getting Unit Input"); 
      EntityReference unitRef = Unit.Get<EntityReference>(executionContext); 
      if (unitRef == null) 
      { 
       crmWorkflowContext.Trace("Error Message : Unit value not provided"); 
       throw new ArgumentNullException("Unit value not provided"); 
      } 

      EntityReference caseRef = GetCase(crmWorkflowContext, unitRef); 

      if (caseRef != null) 
      { 
       Case.Set(executionContext, caseRef); 
      } 
      else 
      { 
       Case.Set(executionContext, null); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new InvalidWorkflowException(); 
     } 
    } 

    private static EntityReference GetCase(LocalWorkflowContext crmWorkflowContext, EntityReference unitRef) 
    { 
     EntityReference caseRef = null; 

     CrmServiceContext serviceContext = new CrmServiceContext(crmWorkflowContext.OrganizationService); 
     var caseRecord = (from currentcase in serviceContext.IncidentSet 
          where currentcase.gsscore_Unitid.Id == unitRef.Id 
           && currentcase.gsscore_CaseTypeId.Id == new Guid("3A152B94-D2DF-E711-A94A-000D3A30DB97") 
          orderby currentcase.CreatedOn descending 
          select currentcase).FirstOrDefault(); 

     crmWorkflowContext.Trace("Case Record" + caseRecord); 

     if (caseRecord != null) 
      caseRef = caseRecord.ToEntityReference(); 

     return caseRef; 
    } 
} 

코드 2 워크 플로 -

public class NMSGetWorkOrderForCase : WorkFlowActivityBase 
{ 
    #region Input Parameters 
    [Input(gsscore_nmsmessage.Fields.gsscore_CaseId)] 
    [ReferenceTarget(Incident.EntityLogicalName)] 
    public InArgument<EntityReference> Case { get; set; } 
    #endregion 

    #region Output Parameters 
    [Output(gsscore_nmsmessage.Fields.WorkOrder)] 
    [ReferenceTarget(msdyn_workorder.EntityLogicalName)] 
    public OutArgument<EntityReference> NMSWorkOrder { get; set; } 
    #endregion 

    public override void ExecuteCRMWorkFlowActivity(CodeActivityContext executionContext, LocalWorkflowContext crmWorkflowContext) 
    { 
     if (crmWorkflowContext == null) 
     { 
      throw new ArgumentNullException("crmWorkflowContext is Null"); 
     } 


     if (Case.Get(executionContext) == null) 
     { 
      crmWorkflowContext.UserId = crmWorkflowContext.WorkflowExecutionContext.UserId; 
      throw new InvalidWorkflowException(); 
     } 

     crmWorkflowContext.Trace("Start"); 
     Guid caseId = Case.Get<EntityReference>(executionContext).Id; 
     try 
     { 
      CrmServiceContext serviceContext = new CrmServiceContext(crmWorkflowContext.OrganizationService); 
      var WorkOrderRecord = (from currentworkoder in serviceContext.msdyn_workorderSet 
            where currentworkoder.msdyn_ServiceRequest.Id == caseId 
            orderby currentworkoder.CreatedOn descending 
            select currentworkoder.Id 
            ).ToList().FirstOrDefault(); 

      if (WorkOrderRecord != null) 
      { 
       EntityReference workorderRef = new EntityReference(msdyn_workorder.EntityLogicalName, WorkOrderRecord); 
       NMSWorkOrder.Set(executionContext, workorderRef); 
      } 
     } 
     catch (Exception ex) 
     { 
      crmWorkflowContext.TracingService.Trace("Case record does not exist." + crmWorkflowContext.WorkflowExecutionContext.MessageName + ex.Message); 
      if (crmWorkflowContext.ErrorCode == null) 
      { 
       crmWorkflowContext.ErrorCode = ((int)WorkflowActivityErrorCode.NMSGetWorkOrderForCaseError).ToString(); 
      } 
      crmWorkflowContext.UserId = crmWorkflowContext.WorkflowExecutionContext.UserId; 
      throw new InvalidWorkflowException(); 
     } 

    } 
} 
+1

으로 변경해야합니다. 첫 번째 워크 플로가 실제로 출력을 제공하고 있습니까? –

+0

2 단계 WF 활동이있는 두 번째 단계를 제거하고 1 단계 WF 활동을 디버그하여 caseRecord & caseRef에 들어오는 것을 확인하는 것과 같이 단계별로 단계별로 설명하지 않는 이유는 무엇입니까? 추적이 너에게 이미 어떤 생각을 주었어야 했어 ..? –

답변

0

WorkOrderRecord 레코드는 GUID입니다. null 일 수 없습니다. if (WorkOrderRecord != null)if (WorkOrderRecord != Guid.Empty)