コード例 #1
0
        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();
            }
        }
コード例 #2
0
ファイル: TempDBContext.cs プロジェクト: wwwK/EntityDB
        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());
        }