//public List<ISARelationshipDTO> GetISARelationships(int tableDrivedEntityID)
        //{
        //    List<ISARelationshipDTO> result = new List<ISARelationshipDTO>();
        //    using (var projectContext = new MyIdeaEntities())
        //    {
        //        var list = projectContext.ISARelationship.Where(x => x.TableDrivedEntityID1 == tableDrivedEntityID || x.TableDrivedEntityID2 == tableDrivedEntityID);
        //        foreach (var item in list)
        //        {
        //            result.Add(ToISARelationshipDTO(item));
        //        }
        //    }
        //    return result;
        //}
        private ISARelationshipDTO ToISARelationshipDTO(ISARelationship item)
        {
            ISARelationshipDTO result = new ISARelationshipDTO();

            result.Name                 = item.Name;
            result.ID                   = item.ID;
            result.IsGeneralization     = item.IsGeneralization == true;
            result.IsTolatParticipation = item.IsTolatParticipation;
            result.IsDisjoint           = item.IsDisjoint;
            result.SuperTypeEntities    = "";
            foreach (var superType in item.SuperToSubRelationshipType)
            {
                if (!result.SuperTypeEntities.Contains(superType.RelationshipType.Relationship.TableDrivedEntity.Name))
                {
                    result.SuperTypeEntities += (result.SuperTypeEntities == "" ? "" : ",") + superType.RelationshipType.Relationship.TableDrivedEntity.Name;
                }
            }
            result.SubTypeEntities = "";
            foreach (var subType in item.SubToSuperRelationshipType)
            {
                result.SubTypeEntities += (result.SubTypeEntities == "" ? "" : ",") + subType.RelationshipType.Relationship.TableDrivedEntity.Name;
            }
            return(result);
        }
        public int Save(ISARelationshipDTO item)
        {
            using (var projectContext = new MyIdeaEntities())
            {
                ISARelationship dbItem = null;
                if (item.ID == 0)
                {
                    dbItem = new ISARelationship();
                    projectContext.ISARelationship.Add(dbItem);
                }
                else
                {
                    dbItem = projectContext.ISARelationship.First(x => x.ID == item.ID);
                }

                dbItem.Name                 = item.Name;
                dbItem.IsDisjoint           = item.IsDisjoint;
                dbItem.IsGeneralization     = item.IsGeneralization;
                dbItem.IsSpecialization     = !item.IsSpecialization;
                dbItem.IsTolatParticipation = item.IsTolatParticipation;
                projectContext.SaveChanges();
                return(dbItem.ID);
            }
        }
        public int Save(TableDrivedEntityDTO baseEntity, TableDrivedEntityDTO drivedEntity, bool inheritance, bool isTolatParticipation, bool isDisjoint)
        {
            using (var projectContext = new MyIdeaEntities())
            {
                foreach (var item in drivedEntity.Relationships)
                {
                    var          dbRelationship        = projectContext.Relationship.First(x => x.ID == item.ID);
                    Relationship dbReverseRelationship = null;
                    if (dbRelationship.Relationship2 != null)
                    {
                        dbReverseRelationship = dbRelationship.Relationship2;
                    }
                    else
                    {
                        dbReverseRelationship = projectContext.Relationship.First(x => x.RelationshipID == item.ID);
                    }

                    if (dbRelationship.TableDrivedEntity.TableID == baseEntity.TableID)
                    {
                        if (dbRelationship.Relationship2 == null)
                        {
                            dbRelationship.Name = dbRelationship.Name.Replace("(PK)" + dbRelationship.TableDrivedEntity.Name + ".", "(PK)" + drivedEntity.Name + ".");
                        }
                        else
                        {
                            dbRelationship.Name = dbRelationship.Name.Replace("(FK)" + dbRelationship.TableDrivedEntity.Name + ".", "(FK)" + drivedEntity.Name + ".");
                        }

                        dbRelationship.TableDrivedEntityID1 = drivedEntity.ID;
                    }
                    if (dbRelationship.TableDrivedEntity1.TableID == baseEntity.TableID)
                    {
                        if (dbRelationship.Relationship2 == null)
                        {
                            dbRelationship.Name = dbRelationship.Name.Replace("(FK)" + dbRelationship.TableDrivedEntity.Name + ".", "(FK)" + drivedEntity.Name + ".");
                        }
                        else
                        {
                            dbRelationship.Name = dbRelationship.Name.Replace("(PK)" + dbRelationship.TableDrivedEntity.Name + ".", "(PK)" + drivedEntity.Name + ".");
                        }
                        dbRelationship.TableDrivedEntityID2 = drivedEntity.ID;
                    }

                    if (dbReverseRelationship.TableDrivedEntity.TableID == baseEntity.TableID)
                    {
                        if (dbReverseRelationship.Relationship2 == null)
                        {
                            dbReverseRelationship.Name = dbReverseRelationship.Name.Replace("(PK)" + dbRelationship.TableDrivedEntity.Name + ".", "(PK)" + drivedEntity.Name + ".");
                        }
                        else
                        {
                            dbReverseRelationship.Name = dbReverseRelationship.Name.Replace("(FK)" + dbRelationship.TableDrivedEntity.Name + ".", "(FK)" + drivedEntity.Name + ".");
                        }
                        dbReverseRelationship.TableDrivedEntityID1 = drivedEntity.ID;
                    }
                    if (dbReverseRelationship.TableDrivedEntity1.TableID == baseEntity.TableID)
                    {
                        if (dbReverseRelationship.Relationship2 == null)
                        {
                            dbReverseRelationship.Name = dbReverseRelationship.Name.Replace("(FK)" + dbRelationship.TableDrivedEntity.Name + ".", "(FK)" + drivedEntity.Name + ".");
                        }
                        else
                        {
                            dbReverseRelationship.Name = dbReverseRelationship.Name.Replace("(PK)" + dbRelationship.TableDrivedEntity.Name + ".", "(PK)" + drivedEntity.Name + ".");
                        }
                        dbReverseRelationship.TableDrivedEntityID2 = drivedEntity.ID;
                    }
                }
                if (inheritance && !(drivedEntity.ID == baseEntity.ID))
                {
                    ISARelationship isaRelationship = null;

                    var sampleSuperToSub = projectContext.Relationship.FirstOrDefault(x => x.TableDrivedEntityID1 == baseEntity.ID && x.RelationshipType != null &&
                                                                                      x.RelationshipType.SuperToSubRelationshipType != null);
                    if (sampleSuperToSub != null)
                    {
                        isaRelationship = sampleSuperToSub.RelationshipType.SuperToSubRelationshipType.ISARelationship;
                    }

                    if (isaRelationship == null)
                    {
                        isaRelationship = new ISARelationship();
                    }
                    isaRelationship.IsTolatParticipation = isTolatParticipation;
                    isaRelationship.IsDisjoint           = isDisjoint;

                    string subTypesStr = "";
                    foreach (var relationship in isaRelationship.SuperToSubRelationshipType)
                    {
                        if (relationship.RelationshipType.Relationship.TableDrivedEntity1.ID != baseEntity.ID)
                        {
                            subTypesStr += (subTypesStr == "" ? "" : ",") + relationship.RelationshipType.Relationship.TableDrivedEntity1.Name;
                        }
                    }
                    if (drivedEntity.ID == 0)
                    {
                        subTypesStr += (subTypesStr == "" ? "" : ",") + drivedEntity.Name;
                    }
                    isaRelationship.Name = baseEntity.Name + ">" + subTypesStr;

                    if (drivedEntity.ID == 0)
                    {
                        var relationship = new Relationship();
                        relationship.RelationshipType = new RelationshipType();
                        relationship.RelationshipType.SuperToSubRelationshipType = new SuperToSubRelationshipType();
                        relationship.RelationshipType.IsOtherSideCreatable       = true;
                        relationship.TableDrivedEntityID1 = baseEntity.ID;
                        relationship.RelationshipType.SuperToSubRelationshipType.ISARelationship = isaRelationship;
                        //drivedEntity.Relationship1.Add(relationship);

                        var relationshipReverse = new Relationship();
                        relationshipReverse.RelationshipType = new RelationshipType();
                        relationshipReverse.RelationshipType.SubToSuperRelationshipType = new SubToSuperRelationshipType();
                        relationshipReverse.RelationshipType.IsOtherSideCreatable       = true;
                        relationshipReverse.TableDrivedEntityID2 = baseEntity.ID;
                        relationshipReverse.RelationshipType.SubToSuperRelationshipType.ISARelationship = isaRelationship;
                        relationshipReverse.Relationship2 = relationship;
                        //drivedEntity.Relationship.Add(relationshipReverse);

                        var    dbBaseEntity = projectContext.TableDrivedEntity.First(x => x.ID == baseEntity.ID);
                        string PKColumns    = "";
                        string FKColumns    = "";
                        foreach (var primaryCol in dbBaseEntity.Table.Column.Where(x => x.PrimaryKey == true))
                        {
                            PKColumns += (PKColumns == "" ? "" : ",") + primaryCol.Name;
                            FKColumns += (FKColumns == "" ? "" : ",") + primaryCol.Name;
                            relationship.RelationshipColumns.Add(new RelationshipColumns()
                            {
                                Column = primaryCol, Column1 = primaryCol
                            });
                            relationshipReverse.RelationshipColumns.Add(new RelationshipColumns()
                            {
                                Column = primaryCol, Column1 = primaryCol
                            });
                        }
                        relationship.Name        = "(PK)" + baseEntity.Name + "." + PKColumns + ">(FK)" + drivedEntity.Name + "." + FKColumns;
                        relationshipReverse.Name = "(FK)" + drivedEntity.Name + "." + FKColumns + ">(PK)" + baseEntity.Name + "." + PKColumns;
                    }
                }
                //if (drivedEntity.ID == 0)
                //    projectContext.TableDrivedEntity.Add(drivedEntity);
                projectContext.SaveChanges();
                return(0);
            }
        }