//public List<EntityGroupRelationshipDTO> GetEntityGroupRelationships(int entityGroupID)
        //{
        //    List<EntityGroupRelationshipDTO> result = new List<EntityGroupRelationshipDTO>();
        //    using (var projectContext = new DataAccess.MyProjectEntities())
        //    {
        //        var list = projectContext.EntityGroup_Relationship.Where(x => x.EntityGroupID == entityGroupID);
        //        foreach (var ritem in list)
        //        {
        //            EntityGroupRelationshipDTO egr = ToEntityGroupRelationshipDTO(ritem);
        //            result.Add(egr);
        //        }
        //    }
        //    return result;
        //}
        private EntityGroupRelationshipDTO ToEntityGroupRelationshipDTO(EntityGroup_Relationship ritem, bool withDetails)
        {
            var egr = new EntityGroupRelationshipDTO();

            egr.ID = ritem.ID;
            egr.RelationshipTailID = ritem.EntityRelationshipTailID ?? 0;
            if (withDetails)
            {
                if (ritem.EntityRelationshipTail != null)
                {
                    BizEntityRelationshipTail bizEntityRelationshipTail = new MyModelManager.BizEntityRelationshipTail();
                    egr.RelationshipTail = bizEntityRelationshipTail.ToEntityRelationshipTailDTO(ritem.EntityRelationshipTail);
                    egr.vwName           = egr.RelationshipTail.TargetEntityAlias;
                }
                else
                {
                    egr.vwName = ritem.EntityGroup.Process.TableDrivedEntity.Alias;
                }
            }
            //if (ritem.EntityRelationshipTail != null)
            //    egr.Name = ritem.EntityRelationshipTail.RelationshipPath;
            //else
            //    egr.Name = "موجودیت اصلی";
            return(egr);
        }
        private bool DataIsAccessable(DR_Requester requester, EntityGroup_Relationship ritem)
        {
            bool isvalid = true;

            if (ritem.EntityRelationshipTailID != null)
            {
                if (!bizEntityRelationshipTail.DataIsAccessable(requester, ritem.EntityRelationshipTail))
                {
                    isvalid = false;
                }
            }
            else if (ritem.EntityGroup.Process.TableDrivedEntity != null)
            {
                if (!bizTableDrivedEntity.DataIsAccessable(requester, ritem.EntityGroup.Process.TableDrivedEntity))
                {
                    isvalid = false;
                }
            }
            return(isvalid);
        }
 public int UpdateEntityGroups(EntityGroupDTO message)
 {
     using (var projectContext = new DataAccess.MyProjectEntities())
     {
         var dbEntityGroup = projectContext.EntityGroup.FirstOrDefault(x => x.ID == message.ID);
         if (dbEntityGroup == null)
         {
             dbEntityGroup = new DataAccess.EntityGroup();
         }
         dbEntityGroup.ID        = message.ID;
         dbEntityGroup.ProcessID = message.ProcessID;
         dbEntityGroup.Name      = message.Name;
         while (dbEntityGroup.EntityGroup_Relationship.Any())
         {
             projectContext.EntityGroup_Relationship.Remove(dbEntityGroup.EntityGroup_Relationship.First());
         }
         foreach (var msg in message.Relationships)
         {
             var db = new EntityGroup_Relationship();
             if (msg.RelationshipTailID != 0)
             {
                 db.EntityRelationshipTailID = msg.RelationshipTailID;
             }
             else
             {
                 db.EntityRelationshipTailID = null;
             }
             dbEntityGroup.EntityGroup_Relationship.Add(db);
         }
         if (dbEntityGroup.ID == 0)
         {
             projectContext.EntityGroup.Add(dbEntityGroup);
         }
         projectContext.SaveChanges();
         return(dbEntityGroup.ID);
     }
 }
        //public List<int> GetProcessAdmins(int processID)
        //{
        //    using (var projectContext = new DataAccess.MyProjectEntities())
        //    {
        //        var process = projectContext.Process.First(x => x.ID == processID);
        //        return process.ProcessAdminRoleTypes.Select(x => x.RoleTypeID).ToList();
        //    }

        //}

        public int UpdateProcesss(ProcessDTO message)
        {
            using (var projectContext = new DataAccess.MyProjectEntities())
            {
                var dbProcess = projectContext.Process.FirstOrDefault(x => x.ID == message.ID);
                if (dbProcess == null)
                    dbProcess = new DataAccess.Process();
                dbProcess.ID = message.ID;
                dbProcess.Name = message.Name;
                //dbProcess.AdminRoleGroupID = message.AdminRoleGroupID;

                if (message.EntityID != 0)
                {
                    dbProcess.TableDrivedEntityID = message.EntityID;
                    List<EntityGroup> removeListEntityGroup = new List<EntityGroup>();

                    foreach (var entityGroup in dbProcess.EntityGroup)
                    {
                        if (!message.EntityGroups.Any(x => x.ID == entityGroup.ID))
                            removeListEntityGroup.Add(entityGroup);
                    }
                    foreach (var entityGroup in removeListEntityGroup)
                    {
                        while (entityGroup.EntityGroup_Relationship.Any())
                            projectContext.EntityGroup_Relationship.Remove(entityGroup.EntityGroup_Relationship.First());
                        while (entityGroup.TransitionAction_EntityGroup.Any())
                            projectContext.TransitionAction_EntityGroup.Remove(entityGroup.TransitionAction_EntityGroup.First());
                        projectContext.EntityGroup.Remove(entityGroup);
                    }
                    foreach (var mGroup in message.EntityGroups)
                    {
                        EntityGroup dbGroup = null;
                        if (mGroup.ID == 0)
                        {
                            dbGroup = new EntityGroup();
                            dbProcess.EntityGroup.Add(dbGroup);
                        }
                        else
                            dbGroup = dbProcess.EntityGroup.First(x => x.ID == mGroup.ID);

                        dbGroup.Name = mGroup.Name;
                        List<EntityGroup_Relationship> removeListRel = new List<EntityGroup_Relationship>();
                        foreach (var rel in dbGroup.EntityGroup_Relationship)
                        {
                            if (!mGroup.Relationships.Any(x => x.ID == rel.ID))
                                removeListRel.Add(rel);
                        }
                        foreach (var rel in removeListRel)
                            projectContext.EntityGroup_Relationship.Remove(rel);

                        foreach (var mRel in mGroup.Relationships)
                        {
                            EntityGroup_Relationship dbRel = null;
                            if (mRel.ID == 0)
                            {
                                dbRel = new EntityGroup_Relationship();
                                dbGroup.EntityGroup_Relationship.Add(dbRel);
                            }
                            else
                                dbRel = dbGroup.EntityGroup_Relationship.First(x => x.ID == mRel.ID);
                            if (mRel.RelationshipTailID != 0)
                                dbRel.EntityRelationshipTailID = mRel.RelationshipTailID;
                            else
                                dbRel.EntityRelationshipTailID = null;
                        }
                    }
                }
                else
                {
                    dbProcess.TableDrivedEntityID = null;
                    while (dbProcess.EntityGroup.Any())
                    {
                        while (dbProcess.EntityGroup.First().EntityGroup_Relationship.Any())
                            projectContext.EntityGroup_Relationship.Remove(dbProcess.EntityGroup.First().EntityGroup_Relationship.First());
                        while (dbProcess.EntityGroup.First().TransitionAction_EntityGroup.Any())
                            projectContext.TransitionAction_EntityGroup.Remove(dbProcess.EntityGroup.First().TransitionAction_EntityGroup.First());
                        projectContext.EntityGroup.Remove(dbProcess.EntityGroup.First());
                    }
                }
                dbProcess.TransitionFlowSTR = message.TransitionFlowSTR;


                //while (dbProcess.ProcessAdminRoleTypes.Any())
                //    projectContext.ProcessAdminRoleTypes.Remove(dbProcess.ProcessAdminRoleTypes.First());
                //foreach (var roletype in message.AdminRoleTypes)
                //{
                //    dbProcess.ProcessAdminRoleTypes.Add(new ProcessAdminRoleTypes() { RoleTypeID = roletype.ID });
                //}

                //////while (dbProcess.RequestInitializers.Any())
                //////    projectContext.RequestInitializers.Remove(dbProcess.RequestInitializers.First());
                //////foreach (var roleGroup in message.ProcessInitializerRoleGroups)
                //////{
                //////    dbProcess.RequestInitializers.Add(new RequestInitializers() { RoleGroupID = roleGroup.ID });
                //////}


                if (dbProcess.ID == 0)
                    projectContext.Process.Add(dbProcess);
                projectContext.SaveChanges();
                return dbProcess.ID;
            }
        }