Пример #1
0
        public static void CreateContext <TContext>(int dbVersion, string contextPath = "", string namespaceName = "")
        {
            string       contextName  = typeof(TContext).Name;
            DB_Operation dB_Operation = new DB_Operation(contextName);

            dB_Operation.ContextGenerateFromDB(dbVersion, contextPath, namespaceName);
            CreateEverythingForMYSQL <TContext>();
        }
Пример #2
0
        private static void CreateEverythingForMYSQL <TContext>()
        {
            CreateDatabase <TContext> createDatabase = new CreateDatabase <TContext>();
            Tuple <string, string>    tupleData      = createDatabase.EntityClassQueries();

            DB_Operation      dB_Operation = new DB_Operation(typeof(TContext).Name);
            Tuple <bool, int> tupleData2   = dB_Operation.CreateORAlterDatabaseAndTables(tupleData.Item2, tupleData.Item1);

            string    contextName = typeof(TContext).Name;
            XDocument xDocument   = XDocument.Load(path);

            if (xDocument.Element("Databases").Element(contextName).Elements("Version") != null)
            {
                xDocument.Element("Databases").Element(contextName).Elements("Version").Remove();
            }
            xDocument.Element("Databases").Element(contextName).Add(new XElement("Version", new XAttribute("value", tupleData2.Item2)));
            xDocument.Save(path);
        }
Пример #3
0
        /// <summary>
        /// MYSQL Server için oluşturulacak Query ler generate edilir
        /// </summary>
        /// <returns></returns>
        public Tuple <string, string> EntityClassQueries()
        {
            #region Field Defination
            Type    entityType;
            dynamic entityInformation;
            string  entityColumnsMYSQL           = string.Empty,
                    createTableMYSQLQuery        = string.Empty,
                    alterTableMYSQLQuery         = string.Empty,
                    dropTableMYSQLQuery          = string.Empty,
                    dropConstraintListMYSQLQuery = string.Empty,
                    entityColumnsXML             = string.Empty,
                    entityColumnXML          = string.Empty,
                    createXMLObjectQuery     = string.Empty;
            List <string> dropConstraintList = new List <string>();
            #endregion

            #region Entity Classlarının property olarak tanımlanmış olduğu Context sınıfından Class lar generate edilir
            List <dynamic> implementedTableEntities = (from property in typeof(TDBEntity).GetProperties()
                                                       from genericArguments in property.PropertyType.GetGenericArguments()
                                                       where genericArguments.CustomAttributes.FirstOrDefault() != null &&
                                                       genericArguments.CustomAttributes.FirstOrDefault().AttributeType.Equals(typeof(TableAttribute))
                                                       orderby genericArguments.CustomAttributes.FirstOrDefault().NamedArguments.FirstOrDefault(x => x.MemberName == "OrdinalPosition").TypedValue.Value
                                                       select Activator.CreateInstance(genericArguments)).ToList();
            #endregion

            #region Creating SQL Server Queries

            #region Veritabanı versiyonu için XML verisi ve Create&Alter Tabloları ve Sütunları
            createXMLObjectQuery = "<Classes>";              // Veritabanında versiyonlama için kullanılacak XML bilgisinin başlangıcı
            foreach (var entity in implementedTableEntities) // Entity Classlar(Tablo) oluşturmak için döngü başlatılır
            {
                entityType        = entity.GetType();
                entityInformation = entityType.GetCustomAttributes(typeof(TableAttribute), false).FirstOrDefault(); // Entity Class üzerindeki Table Attribute üzerinden Schema ve Tablo İsmi okunur

                columnList = new DB_Operation(contextName).ColumnListOnTable(entityType.Name);                      // Veritabanından ilgili tablonun tüm sütunları çekilir

                // Veritabanında Tablonun var olup olmadığı kontrol edilir Tablo Varsa ? ALTER çalışır CREATE çalışmaz : ALTER çalışmaz CREATE çalışır
                bool tableExistOnDb = tableList.FirstOrDefault(x => x.TableName == entityInformation.TableName.ToLower()) != null ? true : false;

                foreach (var entityColumn in entityType.GetProperties()) // Entity Class içerisindeki property ler yani Sütunları oluşturmak için döngü başlatılır
                {
                    // Property inin Custom Attributelerine bakarak MYSQL Query generate edilir
                    var     columnInformation        = new CSHARP_To_MYSQL().GetSQLQueryFormat(entityColumn);
                    var     isEntityColumnPrimaryKey = entityColumn.GetCustomAttributes(typeof(PRIMARY_KEY), false).FirstOrDefault();
                    dynamic isEntityColumnForeignKey = entityColumn.GetCustomAttributes(typeof(FOREIGN_KEY), false).FirstOrDefault();

                    #region Entity Class(Tablo) içerisinde oluşturulmuş yeni bir property(sütun/column) varsa ve Entity Class(Tablo) Veritabanında varsa
                    if (columnList.Where(x => x == entityColumn.Name).Count() == 0 && tableExistOnDb)
                    {
                        if (isEntityColumnPrimaryKey != null && isEntityColumnForeignKey != null)
                        {
                            if (entityColumn.GetCustomAttributes(typeof(FOREIGN_KEY), false).FirstOrDefault() != null)
                            {
                                alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} AUTO_INCREMENT=1;";
                            }
                            alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} ADD {columnInformation};";
                        }
                        if (isEntityColumnPrimaryKey != null)
                        {
                            columnInformation     = columnInformation.Replace($",PRIMARY KEY ({entityColumn.Name})", "");
                            alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} ADD {columnInformation};";
                            alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} ADD PRIMARY KEY ({entityColumn.Name});";
                        }
                        if (isEntityColumnForeignKey != null)
                        {
                            columnInformation     = columnInformation.Replace($",FOREIGN KEY ({isEntityColumnForeignKey.PropertyName}) REFERENCES {isEntityColumnForeignKey.ClassName}({isEntityColumnForeignKey.PropertyName})", "");
                            alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} ADD {columnInformation}; ";
                            alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} " +
                                                    $"ADD FOREIGN KEY({ entityColumn.Name}) REFERENCES {isEntityColumnForeignKey.ClassName}({isEntityColumnForeignKey.PropertyName});";
                        }
                    }
                    #endregion

                    #region Entity Class içerisinde var olup değişikliğe uğramış bir property
                    if (columnList.Where(x => x == entityColumn.Name).Count() > 0)
                    {
                        columnList.Remove(entityColumn.Name); // Tablo içerisindeki sütun listesinden işlem yapılan sütun çıkartılır (DROP edilmeyecektir)
                        Tuple <string, string> constraintTupleData = new DB_Operation(contextName).ConstraintNameByTableAndColumnName(entityInformation.TableName, entityColumn.Name);
                        if (!string.IsNullOrEmpty(constraintTupleData.Item1))
                        {
                            if (isEntityColumnPrimaryKey != null)
                            {
                                dropConstraintList.Add($"ALTER TABLE {entityInformation.TableName} DROP PRIMARY KEY;");

                                // MYSQL Auto Increment olan bir sütunu DROP edemiyor
                                // Önce Sütundan Auto Increment kaldırılır daha sonra PRIMARY KEY DROP edilir
                                columnInformation = columnInformation.Replace($",PRIMARY KEY ({entityColumn.Name})", "");
                                columnInformation = columnInformation.Replace($"AUTO_INCREMENT", "");
                                dropConstraintList.Add($"ALTER TABLE {entityInformation.TableName} MODIFY COLUMN {columnInformation};");
                            }
                            else
                            {
                                dropConstraintList.Add($"ALTER TABLE {entityInformation.TableName} DROP FOREIGN KEY {constraintTupleData.Item1}; ");
                            }
                        }

                        if (isEntityColumnPrimaryKey != null)
                        {
                            columnInformation     = columnInformation.Replace($",PRIMARY KEY ({entityColumn.Name})", "");
                            alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} ADD PRIMARY KEY ({entityColumn.Name});";
                        }

                        if (isEntityColumnForeignKey != null)
                        {
                            columnInformation     = columnInformation.Replace($",FOREIGN KEY ({isEntityColumnForeignKey.PropertyName}) REFERENCES {isEntityColumnForeignKey.ClassName}({isEntityColumnForeignKey.PropertyName})", "");
                            alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} " +
                                                    $"ADD FOREIGN KEY({ entityColumn.Name}) REFERENCES {isEntityColumnForeignKey.ClassName}({isEntityColumnForeignKey.PropertyName});";
                        }

                        alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} MODIFY COLUMN {columnInformation};";
                    }
                    #endregion

                    #region Entity Class yani Tablo Veritabanında yoksa oluşturulacak olan sütunların MSSQL Query generate edilir
                    if (tableList.Where(x => x.TableName == entityInformation.TableName.ToLower()).Count() == 0)
                    {
                        entityColumnsMYSQL += columnInformation + ", ";
                    }
                    #endregion

                    #region XMLQuery Sütunları generate edilir
                    entityColumnsXML += new CSHARP_To_MYSQL().GetXMLDataFormat(entityColumn);
                    #endregion
                }

                if (!string.IsNullOrEmpty(entityColumnsMYSQL))
                {
                    entityColumnsMYSQL     = entityColumnsMYSQL.Remove(entityColumnsMYSQL.Length - 2);
                    createTableMYSQLQuery += $"CREATE TABLE {entityInformation.TableName} ({entityColumnsMYSQL});";
                }

                // Veritabanında versiyonlama için kullanılacak XML bilgisinin gövdesi
                createXMLObjectQuery += $"<{entityType.Name} TableName=\"{entityInformation.TableName}\" OrdinalPosition=\"{entityInformation.OrdinalPosition}\">" +
                                        $"{entityColumnsXML}" +
                                        $"</{entityType.Name}>";

                #region Tablo tableList listesinden çıkartılır
                DBTableModel tableInformation = tableList.FirstOrDefault(x => x.TableName == entityInformation.TableName.ToLower());
                if (tableInformation != null) // Veritabanında Tablo zaten var ise güncelleme yapılıyordur (DROP edilmeyecektir)
                {
                    tableList.Remove(tableInformation);
                }
                #endregion

                #region DROP edilecek sütunlar
                if (columnList.Count() > 0)
                {
                    string columnNames = string.Empty;
                    foreach (string columnName in columnList)
                    {
                        Tuple <string, string> constraintTupleData = new DB_Operation(contextName).ConstraintNameByTableAndColumnName(entityInformation.TableName, columnName);
                        if (!string.IsNullOrEmpty(constraintTupleData.Item1))
                        {
                            if (constraintTupleData.Item2 == "PRIMARY KEY")
                            {
                                dropConstraintList.Add($"ALTER TABLE {entityInformation.TableName} DROP PRIMARY KEY;");

                                // MYSQL Auto Increment olan bir sütunu DROP edemiyor
                                // Önce Sütundan Auto Increment kaldırılır daha sonra PRIMARY KEY DROP edilir
                                string columnInformation = new DB_Operation(contextName).ColumnInformationFromDB(entityInformation.TableName, columnName);
                                dropConstraintList.Add($"ALTER TABLE {entityInformation.TableName} MODIFY COLUMN {columnName} {columnInformation};");
                            }
                            if (constraintTupleData.Item2 == "FOREIGN KEY")
                            {
                                dropConstraintList.Add($"ALTER TABLE {entityInformation.TableName} DROP FOREIGN KEY {constraintTupleData.Item1};");
                            }
                        }
                        columnNames += $"DROP {columnName}, ";
                    }
                    columnNames           = columnNames.Remove(columnNames.Length - 2);
                    alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} {columnNames};";
                }
                #endregion

                entityColumnsMYSQL = string.Empty;
                entityColumnsXML   = string.Empty;
            } // Entity Class yani Veritabaındaki Tabloları oluşturmak için döngü sonlandırılır
            createXMLObjectQuery += "</Classes>"; // Veritabanında versiyonlama için kullanılacak XML bilgisinin bitişi
            #endregion

            #region DROP edilecek tablolar
            if (tableList.Count() > 0)
            {
                #region __WORM__Configuration dosyası silenecek tablolar listesinden kaldırılır
                DBTableModel wormTable = tableList.FirstOrDefault(x => x.TableName == "__worm__configuration");
                if (wormTable != null)
                {
                    tableList.Remove(wormTable);
                }
                #endregion

                // Tablo listesinde kalan herhangi bir kayıt Veritabanından silinecek tabloyu işaret eder.
                // Yani Kod tarafında bu tabloya ait Entity Class silinmiştir.
                foreach (DBTableModel table in tableList)
                {
                    dropTableMYSQLQuery += $"DROP TABLE {table.TableName};";
                }
            }
            #endregion

            #region Constraintler kaldırılır
            dropConstraintList.Reverse();
            foreach (string item in dropConstraintList)
            {
                dropConstraintListMYSQLQuery += item;
            }
            #endregion

            #endregion

            //                                                    DROP TABLES            ALTER TABLES          CREATE TABLES           XML QUERY
            return(Tuple.Create(dropConstraintListMYSQLQuery + dropTableMYSQLQuery + alterTableMYSQLQuery + createTableMYSQLQuery, createXMLObjectQuery));
        }