public void CreatTable() { EJ.DBTable table = new EJ.DBTable() { Name = "Table1", id = 1, }; EJ.DBColumn[] columns = new EJ.DBColumn[3]; columns[0] = new EJ.DBColumn() { Name = "Id", IsPKID = true, IsAutoIncrement = true, dbType = "int", }; columns[1] = new EJ.DBColumn() { Name = "Name", dbType = "varchar", length = "50" }; columns[2] = new EJ.DBColumn() { Name = "Age", dbType = "int", defaultValue = "10" }; EJ.IDXIndex[] idxConfigs = new EJ.IDXIndex[1]; idxConfigs[0] = new EJ.IDXIndex() { Keys = "Name,Age", IsUnique = true, }; var invokeDB = EntityDB.DBContext.CreateDatabaseService($"data source=\"{AppDomain.CurrentDomain.BaseDirectory}\\test.sqlite\"", EntityDB.DatabaseType.Sqlite); var action = new EF_CreateTable_Action(table, columns, idxConfigs); invokeDB.DBContext.BeginTransaction(); try { action.Invoke(invokeDB); } catch { throw; } finally { invokeDB.DBContext.RollbackTransaction(); } }
public MigrationOperation[] CheckOperations(List <MigrationOperation> operations, IDatabaseService invokingDB) { //sqlite 不支持column的修改 bool isCreateTable = operations.Any(m => m is CreateTableOperation); string tableName = null; foreach (var o in operations) { if (o is DropColumnOperation) { tableName = ((DropColumnOperation)o).Table; break; } else if (o is RenameColumnOperation) { tableName = ((RenameColumnOperation)o).Table; break; } else if (o is AlterColumnOperation) { tableName = ((AlterColumnOperation)o).Table; break; } } _newTableName = tableName; List <EJ.DBColumn> nowColumns = null; List <EJ.DBColumn> originalColumns = null; List <IndexInfo> nowIndexes = null; List <CreateIndexOperation> newIndexOperations = new List <CreateIndexOperation>(); List <AddColumnOperation> newColumnsOperations = new List <AddColumnOperation>(); if (tableName != null) { _reCreateTable = true; var dbDesignService = DBHelper.CreateDatabaseDesignService(invokingDB.DBContext.DatabaseType); //取出目前数据库所有字段描述 nowColumns = dbDesignService.GetCurrentColumns(invokingDB, tableName); originalColumns = new List <EJ.DBColumn>(); originalColumns.AddRange(nowColumns); nowIndexes = dbDesignService.GetCurrentIndexes(invokingDB, tableName); } foreach (var o in operations) { if (o is DropColumnOperation) { var op = o as DropColumnOperation; var column = nowColumns.FirstOrDefault(m => m.Name == op.Name); if (column != null) { nowColumns.Remove(column); originalColumns.Remove(column); } } else if (o is RenameColumnOperation) { var op = o as RenameColumnOperation; var column = nowColumns.FirstOrDefault(m => m.Name == op.Name); if (column != null) { column.BackupChangedProperties["copyfrom"] = new DataValueChangedItem() { OriginalValue = column.Name }; column.Name = op.NewName; } } else if (o is AlterColumnOperation) { var op = o as AlterColumnOperation; var column = nowColumns.FirstOrDefault(m => m.Name == op.Name); if (column != null) { column.dbType = op.ColumnType; column.defaultValue = (string)op.DefaultValue; column.CanNull = op.IsNullable; } } else if (o is DropIndexOperation) { var op = o as DropIndexOperation; if (nowIndexes != null) { var item = nowIndexes.FirstOrDefault(m => m.Name == op.Name); if (item != null) { nowIndexes.Remove(item); } } } else if (o is CreateIndexOperation) { newIndexOperations.Add((CreateIndexOperation)o); } else if (o is AddColumnOperation) { newColumnsOperations.Add((AddColumnOperation)o); } else if (o is RenameTableOperation) { _newTableName = ((RenameTableOperation)o).NewName; } } if (tableName != null) { //获取原来所有字段 _newfields = new StringBuilder(); _oldfields = new StringBuilder(); foreach (var o in originalColumns) { if (_oldfields.Length > 0) { _oldfields.Append(','); _newfields.Append(','); } if (o.BackupChangedProperties["copyfrom"] != null) { _oldfields.Append($"[{o.BackupChangedProperties["copyfrom"]}]"); _newfields.Append($"[{o.Name}]"); } else { _oldfields.Append($"[{o.Name}]"); _newfields.Append($"[{o.Name}]"); } } //需要重新建表 operations.Clear(); var _CreateTableOperation = new CreateTableOperation(); operations.Add(_CreateTableOperation); _CreateTableOperation.Name = _newTableName; var pkColumns = nowColumns.Where(m => m.IsPKID == true).Select(m => m.Name.ToLower()).ToArray(); if (pkColumns.Length > 0) { _CreateTableOperation.PrimaryKey = new AddPrimaryKeyOperation(); _CreateTableOperation.PrimaryKey.Columns = pkColumns; } foreach (var column in nowColumns) { var _AddColumnOperation = new AddColumnOperation() { Table = _CreateTableOperation.Name, ClrType = EF_CreateTable_Action.GetCSharpType(column.dbType), ColumnType = column.dbType, DefaultValue = column.defaultValue, IsUnicode = true, IsNullable = column.CanNull.GetValueOrDefault(), Name = column.Name.ToLower(), }; if (!string.IsNullOrEmpty(column.length)) { //借用ComputedColumnSql字段存放length _AddColumnOperation.ComputedColumnSql = column.length; } _CreateTableOperation.Columns.Add(_AddColumnOperation); } _CreateTableOperation.Columns.AddRange(newColumnsOperations); operations.AddRange(newIndexOperations); var idColumns = nowColumns.Where(m => m.IsAutoIncrement == true).Select(m => m.Name.ToLower()).ToArray(); if (idColumns.Length > 0) { foreach (var idc in idColumns) { var _CreateSequenceOperation = new CreateSequenceOperation() { StartValue = 1, Name = idc, }; operations.Add(_CreateSequenceOperation); } } foreach (var indexCfg in nowIndexes) { var keynames = indexCfg.ColumnNames; var _CreateIndexOperation = new CreateIndexOperation(); _CreateIndexOperation.Table = _CreateTableOperation.Name; _CreateIndexOperation.Name = indexCfg.Name; _CreateIndexOperation.Columns = keynames.Select(m => m.ToLower()).ToArray(); _CreateIndexOperation.IsUnique = indexCfg.IsUnique; operations.Add(_CreateIndexOperation); } } return(operations.ToArray()); }