public async Task <bool> Create(WorkflowDirection WorkflowDirection)
        {
            WorkflowDirectionDAO WorkflowDirectionDAO = new WorkflowDirectionDAO();

            WorkflowDirectionDAO.Id = WorkflowDirection.Id;
            WorkflowDirectionDAO.WorkflowDefinitionId   = WorkflowDirection.WorkflowDefinitionId;
            WorkflowDirectionDAO.FromStepId             = WorkflowDirection.FromStepId;
            WorkflowDirectionDAO.ToStepId               = WorkflowDirection.ToStepId;
            WorkflowDirectionDAO.SubjectMailForCreator  = WorkflowDirection.SubjectMailForCreator;
            WorkflowDirectionDAO.SubjectMailForNextStep = WorkflowDirection.SubjectMailForNextStep;
            WorkflowDirectionDAO.BodyMailForCreator     = WorkflowDirection.BodyMailForCreator;
            WorkflowDirectionDAO.BodyMailForNextStep    = WorkflowDirection.BodyMailForNextStep;
            WorkflowDirectionDAO.CreatedAt              = StaticParams.DateTimeNow;
            WorkflowDirectionDAO.UpdatedAt              = StaticParams.DateTimeNow;
            DataContext.WorkflowDirection.Add(WorkflowDirectionDAO);
            await DataContext.SaveChangesAsync();

            WorkflowDirection.Id = WorkflowDirectionDAO.Id;
            await SaveReference(WorkflowDirection);

            return(true);
        }
        public async Task <bool> BulkMerge(List <WorkflowDirection> WorkflowDirections)
        {
            List <WorkflowDirectionDAO> WorkflowDirectionDAOs = new List <WorkflowDirectionDAO>();

            foreach (WorkflowDirection WorkflowDirection in WorkflowDirections)
            {
                WorkflowDirectionDAO WorkflowDirectionDAO = new WorkflowDirectionDAO();
                WorkflowDirectionDAO.Id = WorkflowDirection.Id;
                WorkflowDirectionDAO.WorkflowDefinitionId   = WorkflowDirection.WorkflowDefinitionId;
                WorkflowDirectionDAO.FromStepId             = WorkflowDirection.FromStepId;
                WorkflowDirectionDAO.ToStepId               = WorkflowDirection.ToStepId;
                WorkflowDirectionDAO.SubjectMailForCreator  = WorkflowDirection.SubjectMailForCreator;
                WorkflowDirectionDAO.SubjectMailForNextStep = WorkflowDirection.SubjectMailForNextStep;
                WorkflowDirectionDAO.BodyMailForCreator     = WorkflowDirection.BodyMailForCreator;
                WorkflowDirectionDAO.BodyMailForNextStep    = WorkflowDirection.BodyMailForNextStep;
                WorkflowDirectionDAO.CreatedAt              = StaticParams.DateTimeNow;
                WorkflowDirectionDAO.UpdatedAt              = StaticParams.DateTimeNow;
                WorkflowDirectionDAOs.Add(WorkflowDirectionDAO);
            }
            await DataContext.BulkMergeAsync(WorkflowDirectionDAOs);

            return(true);
        }
        public async Task <bool> Update(WorkflowDirection WorkflowDirection)
        {
            WorkflowDirectionDAO WorkflowDirectionDAO = DataContext.WorkflowDirection.Where(x => x.Id == WorkflowDirection.Id).FirstOrDefault();

            if (WorkflowDirectionDAO == null)
            {
                return(false);
            }
            WorkflowDirectionDAO.Id = WorkflowDirection.Id;
            WorkflowDirectionDAO.WorkflowDefinitionId   = WorkflowDirection.WorkflowDefinitionId;
            WorkflowDirectionDAO.FromStepId             = WorkflowDirection.FromStepId;
            WorkflowDirectionDAO.ToStepId               = WorkflowDirection.ToStepId;
            WorkflowDirectionDAO.SubjectMailForCreator  = WorkflowDirection.SubjectMailForCreator;
            WorkflowDirectionDAO.SubjectMailForNextStep = WorkflowDirection.SubjectMailForNextStep;
            WorkflowDirectionDAO.BodyMailForCreator     = WorkflowDirection.BodyMailForCreator;
            WorkflowDirectionDAO.BodyMailForNextStep    = WorkflowDirection.BodyMailForNextStep;
            WorkflowDirectionDAO.UpdatedAt              = StaticParams.DateTimeNow;
            await DataContext.SaveChangesAsync();

            await SaveReference(WorkflowDirection);

            return(true);
        }
        private async Task SaveReference(WorkflowDefinition WorkflowDefinition)
        {
            await DataContext.WorkflowStep.Where(s => s.WorkflowDefinitionId == WorkflowDefinition.Id).DeleteFromQueryAsync();

            if (WorkflowDefinition.WorkflowSteps != null)
            {
                List <WorkflowStepDAO> WorkflowStepDAOs = new List <WorkflowStepDAO>();
                foreach (WorkflowStep WorkflowStep in WorkflowDefinition.WorkflowSteps)
                {
                    WorkflowStepDAO WorkflowStepDAO = new WorkflowStepDAO();
                    WorkflowStepDAO.WorkflowDefinitionId = WorkflowDefinition.Id;
                    WorkflowStepDAO.Code   = WorkflowStep.Code;
                    WorkflowStepDAO.Name   = WorkflowStep.Name;
                    WorkflowStepDAO.RoleId = WorkflowStep.RoleId;
                    WorkflowStepDAOs.Add(WorkflowStepDAO);
                }
                await DataContext.WorkflowStep.BulkMergeAsync(WorkflowStepDAOs);

                await DataContext.WorkflowDirection.Where(d => d.WorkflowDefinitionId == WorkflowDefinition.Id).DeleteFromQueryAsync();

                if (WorkflowDefinition.WorkflowDirections != null)
                {
                    List <WorkflowDirectionDAO> WorkflowDirectionDAOs = new List <WorkflowDirectionDAO>();
                    foreach (WorkflowDirection WorkflowDirection in WorkflowDefinition.WorkflowDirections)
                    {
                        WorkflowDirectionDAO WorkflowDirectionDAO = new WorkflowDirectionDAO();
                        WorkflowDirectionDAO.WorkflowDefinitionId = WorkflowDefinition.Id;
                        WorkflowDirectionDAO.FromStepId           = WorkflowStepDAOs.Where(s => s.Name == WorkflowDirection.FromStep.Name).Select(s => s.Id).FirstOrDefault();
                        WorkflowDirectionDAO.ToStepId             = WorkflowStepDAOs.Where(s => s.Name == WorkflowDirection.ToStep.Name).Select(s => s.Id).FirstOrDefault();
                        WorkflowDirectionDAO.CreatedAt            = StaticParams.DateTimeNow;
                        WorkflowDirectionDAO.UpdatedAt            = StaticParams.DateTimeNow;
                        WorkflowDirectionDAOs.Add(WorkflowDirectionDAO);
                    }
                    await DataContext.WorkflowDirection.BulkMergeAsync(WorkflowDirectionDAOs);
                }
            }
        }