コード例 #1
0
        public void AutoMigrateEntity(IDatabase db, IDbMigratorService svr)
        {
            _provider.Logger.Log("开始AutoMigrate...");
            try
            {
                //开启事务
                _provider.BeginTransaction();


                var classmaps = db.GetAllMap().Where(p => p.Value != null && p.Value.IgnoredMigrate == false);
                var maps      = classmaps.Select(p => p.Value);

                //确认 表是否存在,不存在就add table
                var dbtables = _provider.GetTables();

                string         colName = "";
                DbType         colDbType = DbType.String;
                int            colSize = 0;
                ColumnProperty colPropertyType = ColumnProperty.None;
                object         colDefaultValue = null;
                string         tableComment = "", colComment = "";
                string         containTableStr  = db.Config.AutoMigrateOnContainTable;
                string[]       containTables    = containTableStr.ToLower().Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                bool           hasContainTables = false;
                if (containTables.Length > 0)
                {
                    hasContainTables = true;
                }

                string   withoutTableStr  = db.Config.AutoMigrateWithoutTable;
                string[] withoutTables    = withoutTableStr.ToLower().Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                bool     hasWithoutTables = false;
                if (withoutTables.Length > 0)
                {
                    hasWithoutTables = true;
                }

                foreach (var map in maps)
                {
                    var tb = map.TableName;
                    if (hasContainTables)
                    {
                        if (!containTables.Contains(tb.ToLower()))
                        {
                            continue;
                        }
                    }

                    if (hasWithoutTables)
                    {
                        if (withoutTables.Contains(tb.ToLower()))
                        {
                            continue;
                        }
                    }

                    var oneMap     = classmaps.FirstOrDefault(p => p.Value.TableName == tb);
                    var properties = oneMap.Value != null ? oneMap.Value.Properties : null;
                    if (properties != null)
                    {
                        properties = properties.Where(p => p.Ignored == false).ToList();
                    }
                    IPropertyMap identiProperty = null;
                    if (properties != null)
                    {
                        //只支持一个自增列
                        identiProperty = properties.FirstOrDefault(p => p.KeyType == KeyType.Identity || p.KeyType == KeyType.TriggerIdentity);
                    }

                    //存在表
                    if (dbtables.Any(p => p.Equals(tb, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        if (db.Config.CanUpdatedWhenTableExisted == true)
                        {
                            var dbColumns = _provider.GetColumns(tb);

                            if (db.Config.AutoRemoveUnuseColumnInTable == true)//自动清空不在属性列表中的列
                            {
                                var propertyNames = properties.Select(p => p.ColumnName.ToUpper()).ToList();

                                var noUseColumns = dbColumns.Where(p => !propertyNames.Contains(p.Name.ToUpper())).ToList();
                                foreach (var noUseColumn in noUseColumns)
                                {
                                    _provider.RemoveColumn(tb, noUseColumn.Name);
                                }
                            }

                            foreach (var property in properties)
                            {
                                colName = property.ColumnName;
                                if (property.Ignored == true) //标记忽略的跳过
                                {
                                    continue;
                                }
                                //存在指定的列
                                if (dbColumns.Any(p => p.Name.Equals(colName, StringComparison.InvariantCultureIgnoreCase)))
                                {
                                    //oracle 中的blob和clob无法修改
                                    if (_provider.MigratorDbType == MigratorDbType.Oracle || _provider.MigratorDbType == MigratorDbType.OracleManaged)
                                    {
                                        if (property.LobType != LobType.None)
                                        {
                                            continue;
                                        }
                                    }

                                    colPropertyType = GetColumnProperty(property);
                                    colDbType       = svr.GetDBType(property.PropertyInfo.PropertyType);

                                    // 修改列
                                    Column dbCol = dbColumns.FirstOrDefault(p => p.Name.Equals(colName, StringComparison.InvariantCultureIgnoreCase)); //  _provider.GetColumnByName(tb, colName);
                                    if (dbCol != null && property.KeyType == KeyType.NotAKey && dbCol.IsPrimaryKey == false &&
                                        dbCol.IsIdentity == false && dbCol.IsPrimaryKeyWithIdentity == false &&
                                        (dbCol.Size != property.ColumnSize
                                         //|| dbCol.Type !=  colDbType
                                         //|| dbCol.ColumnProperty != colPropertyType
                                        )
                                        ) //只能修改非主键
                                    {
                                        dbCol.Size = property.ColumnSize;
                                        //dbCol.DefaultValue = property.ColumnDefaultValue;

                                        dbCol.ColumnProperty = colPropertyType;
                                        dbCol.Type           = colDbType;
                                        _provider.ChangeColumn(tb, dbCol);
                                    }
                                }
                                else//不存在列
                                {
                                    colDbType       = svr.GetDBType(property.PropertyInfo.PropertyType);
                                    colSize         = property.ColumnSize;
                                    colDefaultValue = property.ColumnDefaultValue;
                                    colPropertyType = GetColumnProperty(property);

                                    //增加列到数据库
                                    _provider.AddColumn(tb, colName, colDbType, colSize, colPropertyType, colDefaultValue);
                                }
                            }



                            ///////////////////////////////////////////
                            //如果是oracle则增加自增序列
                            if (_provider.MigratorDbType == MigratorDbType.Oracle || _provider.MigratorDbType == MigratorDbType.OracleManaged)
                            {
                                AddSequence(tb, map.SequenceName, identiProperty);
                            }

                            //增加表注释
                            tableComment = map.TableDescription;
                            if (!string.IsNullOrEmpty(tableComment))
                            {
                                _provider.AddTableDescription(tb, tableComment);
                            }

                            //增加列注释
                            foreach (var property in properties)
                            {
                                colComment = property.ColumnDescription;
                                if (!string.IsNullOrEmpty(colComment))
                                {
                                    colName = property.ColumnName;
                                    _provider.AddColumnDescription(tb, colName, colComment);
                                }
                            }
                        }
                    }
                    else//不存在表
                    {
                        List <Column> dbColumns = new List <Column>();
                        //组合列
                        foreach (var property in properties)
                        {
                            colName         = property.ColumnName;
                            colDbType       = svr.GetDBType(property.PropertyInfo.PropertyType);
                            colSize         = property.ColumnSize;
                            colDefaultValue = property.ColumnDefaultValue;

                            colPropertyType = GetColumnProperty(property);
                            Column dbcol = new Column(colName, colDbType, colSize, colPropertyType, colDefaultValue);
                            dbColumns.Add(dbcol);
                        }
                        //增加表到数据库
                        _provider.AddTable(tb, dbColumns.ToArray());



                        ///////////////////////////////////////////
                        //如果是oracle则增加自增序列
                        if (_provider.MigratorDbType == MigratorDbType.Oracle || _provider.MigratorDbType == MigratorDbType.OracleManaged)
                        {
                            AddSequence(tb, map.SequenceName, identiProperty);
                        }

                        //增加表注释
                        tableComment = map.TableDescription;
                        if (!string.IsNullOrEmpty(tableComment))
                        {
                            _provider.AddTableDescription(tb, tableComment);
                        }

                        //增加列注释
                        foreach (var property in properties)
                        {
                            colComment = property.ColumnDescription;
                            if (!string.IsNullOrEmpty(colComment))
                            {
                                colName = property.ColumnName;
                                _provider.AddColumnDescription(tb, colName, colComment);
                            }
                        }
                    }
                }

                //提交
                _provider.Commit();
            }
            catch (Exception ex)
            {
                _provider.Logger.Log("AutoMigrate出错:" + ex);
                //回滚
                _provider.Rollback();
                throw new PureDataException("AutoMigrateHelper", ex);
            }
            finally
            {
                db.Close();
            }
            _provider.Logger.Log("AutoMigrate完成 - " + DateTime.Now);
        }