/// <summary> /// Veritabanı üzerindeki tabloları isim ve şema birlikte listeler /// </summary> /// <returns></returns> public List <DBTableModel> TableListOnDB() { List <DBTableModel> tableList = new List <DBTableModel>(); try { using (connection = DBConnectionFactory.Instance(this.contextName)) { DBConnectionOperation.ConnectionOpen(connection); DataTable tables = connection.GetSchema("Tables"); foreach (DataRow table in tables.Rows) { DBTableModel dBTableModel = new DBTableModel { TableName = table[2].ToString() }; tableList.Add(dBTableModel); } } } catch (Exception) { DBConnectionOperation.ConnectionClose(connection); } return(tableList); }
private TableSchemaModel CreateSchema(DBTableModel table) { return(new TableSchemaModel { TableName = table.Table, Columns = CreateColumns(table.Columns) }); }
/// <summary> /// TR : SQL Server için oluşturulacak tabloların, sütunların sorguları generate edilir /// EN : /// </summary> /// <returns> /// TupleData Item1 : TR : SQL Server üzerinde çalıştırılacak sorgular EN : /// TupleData Item2 : TR : __WORM_Configuration tablosunda tutulacak Veritabanı XML formu EN : /// </returns> public Tuple <string, string> EntityClassQueries() { #region Field Defination Type entityType; dynamic entityInformation; string entityColumnsMSSQL = string.Empty, createTableMSSQLQuery = string.Empty, alterTableMSSQLQuery = string.Empty, dropTableMSSQLQuery = string.Empty, dropConstraintListMSSQLQuery = string.Empty, entityColumnsXML = string.Empty, entityColumnXML = string.Empty, createXMLObjectQuery = string.Empty; List <string> dropConstraintList = new List <string>(); #endregion #region Entity Class(Tablolar)larının property(sütun) olarak tanımlanmış olduğu Context(Database) sınıfından Entity Class(tablo)lar listelenir 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ı sorguları oluşturulur createXMLObjectQuery = "<Classes>"; // Veritabanında versiyonlama için kullanılacak XML bilgisinin başlangıcı foreach (var entity in implementedTableEntities) // Entity Class yani Veritabaındaki Tabloları 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 bilgiler 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.SchemaName == entityInformation.SchemaName && x.TableName == entityInformation.TableName) != 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 MSSQL Query generate edilir var columnInformation = new CSHARP_To_MSSQL().GetSQLQueryFormat(entityColumn); #region Entity Class içerisinde oluşturulmuş yeni bir property varsa yani sütun ve Entity Class yani Tablo Veritabanında varsa if (columnList.Where(x => x == entityColumn.Name).Count() == 0 && tableExistOnDb) { alterTableMSSQLQuery += $"ALTER TABLE [{entityInformation.SchemaName}].[{entityInformation.TableName}] ADD {columnInformation} "; } #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.SchemaName, entityInformation.TableName, entityColumn.Name); if (!string.IsNullOrEmpty(constraintTupleData.Item1)) { dropConstraintList.Add($"ALTER TABLE [{entityInformation.SchemaName}].[{entityInformation.TableName}] DROP CONSTRAINT {constraintTupleData.Item1} "); } dynamic isEntityColumnAutoIncrement = entityColumn.GetCustomAttributes(typeof(AUTO_INCREMENT), false).FirstOrDefault(); if (isEntityColumnAutoIncrement != null) { alterTableMSSQLQuery += $"ALTER TABLE [{entityInformation.SchemaName}].[{entityInformation.TableName}] DROP COLUMN {entityColumn.Name} "; columnInformation = columnInformation.Replace("PRIMARY KEY", ""); alterTableMSSQLQuery += $"ALTER TABLE [{entityInformation.SchemaName}].[{entityInformation.TableName}] ADD {columnInformation} "; columnInformation = columnInformation.Replace($"IDENTITY({isEntityColumnAutoIncrement.StartNumber},{isEntityColumnAutoIncrement.Increase})", ""); } var isEntityColumnPrimaryKey = entityColumn.GetCustomAttributes(typeof(PRIMARY_KEY), false).FirstOrDefault(); if (isEntityColumnPrimaryKey != null) { columnInformation = columnInformation.Replace("PRIMARY KEY", ""); alterTableMSSQLQuery += $"ALTER TABLE [{entityInformation.SchemaName}].[{entityInformation.TableName}] ADD PRIMARY KEY ({entityColumn.Name}) "; } dynamic isEntityColumnForeignKey = entityColumn.GetCustomAttributes(typeof(FOREIGN_KEY), false).FirstOrDefault(); if (isEntityColumnForeignKey != null) { columnInformation = columnInformation.Replace($"FOREIGN KEY REFERENCES {isEntityColumnForeignKey.ClassName}({isEntityColumnForeignKey.PropertyName})", ""); alterTableMSSQLQuery += $"ALTER TABLE [{entityInformation.SchemaName}].[{entityInformation.TableName}] " + $"ADD FOREIGN KEY({ entityColumn.Name}) REFERENCES {isEntityColumnForeignKey.ClassName}({isEntityColumnForeignKey.PropertyName}) "; } alterTableMSSQLQuery += $"ALTER TABLE [{entityInformation.SchemaName}].[{entityInformation.TableName}] ALTER COLUMN {columnInformation} "; } #endregion #region Entity Class(tablo) Veritabanında yoksa oluşturulacak olan sütunların MSSQL Query generate edilir if (tableList.Where(x => x.SchemaName == entityInformation.SchemaName && x.TableName == entityInformation.TableName).Count() == 0) { entityColumnsMSSQL += columnInformation + ", "; } #endregion #region XMLQuery Sütunları generate edilir entityColumnsXML += new CSHARP_To_MSSQL().GetXMLDataFormat(entityColumn); #endregion } if (!string.IsNullOrEmpty(entityColumnsMSSQL)) { entityColumnsMSSQL = entityColumnsMSSQL.Remove(entityColumnsMSSQL.Length - 2); createTableMSSQLQuery += $"CREATE TABLE [{entityInformation.SchemaName}].[{entityInformation.TableName}] ({entityColumnsMSSQL}) "; } // Veritabanında versiyonlama için kullanılacak XML bilgisinin gövdesi createXMLObjectQuery += $"<{entityType.Name} SchemaName=\"{entityInformation.SchemaName}\" TableName=\"{entityInformation.TableName}\" OrdinalPosition=\"{entityInformation.OrdinalPosition}\">" + $"{entityColumnsXML}" + $"</{entityType.Name}>"; #region Tablo tableList listesinden çıkartılır DBTableModel tableInformation = tableList.FirstOrDefault(x => x.SchemaName == entityInformation.SchemaName && x.TableName == entityInformation.TableName); 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.SchemaName, entityInformation.TableName, columnName); if (!string.IsNullOrEmpty(constraintTupleData.Item1)) { dropConstraintList.Add($"ALTER TABLE [{entityInformation.SchemaName}].[{entityInformation.TableName}] DROP CONSTRAINT {constraintTupleData.Item1} "); } columnNames += $"{columnName}, "; } columnNames = columnNames.Remove(columnNames.Length - 2); alterTableMSSQLQuery += $"ALTER TABLE [{entityInformation.SchemaName}].[{entityInformation.TableName}] DROP COLUMN {columnNames} "; } #endregion entityColumnsMSSQL = 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.SchemaName == "dbo" && 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) { dropTableMSSQLQuery += $"DROP TABLE [{table.SchemaName}].[{table.TableName}] "; } } #endregion #region Constraintler kaldırılır dropConstraintList.Reverse(); foreach (string item in dropConstraintList) { dropConstraintListMSSQLQuery += item; } #endregion #endregion // DROP TABLES CREATE TABLES ALTER TABLES XML QUERY return(Tuple.Create(dropConstraintListMSSQLQuery + dropTableMSSQLQuery + createTableMSSQLQuery + alterTableMSSQLQuery, createXMLObjectQuery)); }
/// <summary> /// SQL 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, entityColumnsXML = string.Empty, entityColumnXML = string.Empty, createXMLObjectQuery = string.Empty; #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().AttributeType.Equals(typeof(TableAttribute)) 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 Class yani Veritabaındaki Tabloları 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 bilgiler 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ışmaz CREATE çalışır : ALTER çalışır CREATE çalışmaz bool tableExistOnDb = tableList.FirstOrDefault(x => x.SchemaName == entityInformation.SchemaName && x.TableName == entityInformation.TableName) != 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 MSSQL Query generate edilir var columnInformation = new CSHARP_To_POSTGRESQL().GetSQLQueryFormat(entityColumn); #region Entity Class içerisinde oluşturulmuş yeni bir property varsa yani sütun ve Entity Class yani Tablo Veritabanında varsa if (columnList.Where(x => x == entityColumn.Name).Count() == 0 && tableExistOnDb) { alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} ADD {columnInformation} "; } #endregion #region Entity Class içerisinde var olup değişikliğe uğramış bir property // TODO : PrimaryKey ve Foreign Key yapılacak //var isEntityColumnPrimaryKey = entityColumn.GetCustomAttributes(typeof(PRIMARY_KEY), false).FirstOrDefault(); if (columnList.Where(x => x == entityColumn.Name).Count() > 0 /* && isEntityColumnPrimaryKey == null*/) { columnList.Remove(entityColumn.Name); // Tablo içerisindeki sütun listesinden işlem yapılan sütun çıkartılır (DROP edilmeyecektir) alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} ALTER 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.SchemaName == entityInformation.SchemaName && x.TableName == entityInformation.TableName).Count() == 0) { entityColumnsMYSQL += columnInformation + ", "; } #endregion #region XMLQuery Sütunları generate edilir entityColumnsXML += new CSHARP_To_POSTGRESQL().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}>{entityColumnsXML}</{entityType.Name}>"; #region Tablo tableList listesinden çıkartılır DBTableModel tableInformation = tableList.FirstOrDefault(x => x.SchemaName == entityInformation.SchemaName && x.TableName == entityInformation.TableName); 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) { columnNames = $"{columnName}, "; } columnNames = columnNames.Remove(columnNames.Length - 2); alterTableMYSQLQuery += $"ALTER TABLE {entityInformation.TableName} DROP COLUMN {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 #endregion // DROP TABLES CREATE TABLES ALTER TABLES XML QUERY return(Tuple.Create(dropTableMYSQLQuery + createTableMYSQLQuery + alterTableMYSQLQuery, createXMLObjectQuery)); }