Esempio n. 1
0
 public DeleteQueryBuilder(DatabaseColumn column, T value)
 {
     _column = column;
     _value  = value;
 }
Esempio n. 2
0
 protected override bool HandleComputed(DatabaseColumn column)
 {
     return(false); //computed columns aren't supported
 }
Esempio n. 3
0
        void GetColumns()
        {
            using (var command = new NpgsqlCommand(GetColumnsQuery, _connection))
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var schemaName = reader.GetValueOrDefault <string>("nspname");
                        var tableName  = reader.GetValueOrDefault <string>("relname");
                        if (!_tableSelectionSet.Allows(schemaName, tableName))
                        {
                            continue;
                        }

                        var table = _tables[TableKey(tableName, schemaName)];

                        // We need to know about dropped columns because constraints take them into
                        // account when referencing columns. We'll get rid of them before returning the model.
                        var isDropped = reader.GetValueOrDefault <bool>("attisdropped");
                        if (isDropped)
                        {
                            table.Columns.Add(null);
                            continue;
                        }

                        var columnName   = reader.GetValueOrDefault <string>("attname");
                        var dataType     = reader.GetValueOrDefault <string>("typname");
                        var typeModifier = reader.GetValueOrDefault <int>("atttypmod");
                        var typeChar     = reader.GetValueOrDefault <char>("typtype");
                        var elemDataType = reader.GetValueOrDefault <string>("elemtypname");
                        var isNullable   = reader.GetValueOrDefault <bool>("nullable");
                        var defaultValue = reader.GetValueOrDefault <string>("default");

                        // bpchar is just an internal name for char
                        if (dataType == "bpchar")
                        {
                            dataType = "char";
                        }

                        var column = new DatabaseColumn
                        {
                            Table           = table,
                            Name            = columnName,
                            StoreType       = GetStoreType(dataType, typeModifier),
                            IsNullable      = isNullable,
                            DefaultValueSql = defaultValue
                        };

                        if (defaultValue != null)
                        {
                            // Somewhat hacky... We identify serial columns by examining their default expression,
                            // and reverse-engineer these as ValueGenerated.OnAdd
                            if (defaultValue == $"nextval('{tableName}_{columnName}_seq'::regclass)" ||
                                defaultValue == $"nextval('\"{tableName}_{columnName}_seq\"'::regclass)")
                            {
                                // TODO: Scaffold as serial, bigserial, not int...
                                // But in normal code-first I don't have to set the column type...!
                                // TODO: Think about composite keys. Do serial magic only for non-composite.
                                column.ValueGenerated  = ValueGenerated.OnAdd;
                                column.DefaultValueSql = null;
                            }
                        }

                        switch (typeChar)
                        {
                        case 'b':
                            // Base (regular), is the default
                            break;

                        case 'a':
                            // PG array types in pg_type start with underscores (_int for array of int), but the type name
                            // PG accepts when creating columns is int[], translate.
                            if (column.StoreType.StartsWith("_"))
                            {
                                column.StoreType = column.StoreType.Substring(1) + "[]";
                            }
                            break;

                        case 'r':
                            column[NpgsqlAnnotationNames.PostgresTypeType] = PostgresTypeType.Range;
                            break;

                        case 'e':
                            column[NpgsqlAnnotationNames.PostgresTypeType] = PostgresTypeType.Enum;
                            break;

                        default:
                            Logger.Logger.LogWarning($"Can't scaffold column '{columnName}' of type '{dataType}': unknown type char '{typeChar}'");
                            continue;
                        }

                        var comment = reader.GetValueOrDefault <string>("description");
                        if (comment != null)
                        {
                            column[NpgsqlAnnotationNames.Comment] = comment;
                        }

                        table.Columns.Add(column);
                        _tableColumns.Add(ColumnKey(table, column.Name), column);
                    }
                }
        }
Esempio n. 4
0
        public void Write(ClassBuilder cb, DatabaseColumn column)
        {
            var netName = column.NetName ?? column.Name;

            //http://weblogs.asp.net/jgalloway/archive/2005/09/27/426087.aspx
            _friendlyName = Regex.Replace(netName, "([A-Z]+|[0-9]+)", " $1", RegexOptions.Compiled).Trim();

            if (_isNet4) //Display is .Net 4 and Silverlight 3 only
            {
                WriteDisplayAttribute(cb, netName);
            }

            //we won't mark primary keys as required, because they may be assigned by a ORM primary key strategy or database identity/sequence
            if (column.IsPrimaryKey)
            {
                //.Net 4 and Silverlight 3 only
                //NOTE: for EF CodeFirst generation, we also mapped fluently.
                //Despite the duplication, it's useful to have the key as a marker in the model
                if (_isNet4)
                {
                    cb.AppendLine("[Key]");
                }
            }
            else if (!column.Nullable)
            {
                WriteRequiredAttribute(cb);
            }

            //foreign keys will not expose the underlying type
            if (column.IsForeignKey)
            {
                return;
            }

            if (column.IsIndexed &&
                _codeWriterSettings.CodeTarget == CodeTarget.PocoEntityCodeFirst &&
                _codeWriterSettings.WriteCodeFirstIndexAttribute &&
                column.Table != null)
            {
                WriteIndex(cb, column);
            }

            var dt = column.DataType;

            if (dt == null)
            {
                //it is a database specific type
            }
            else if (dt.IsString)
            {
                //if it's over a million characters, no point validating
                if (column.Length < 1073741823 && column.Length > 0)
                {
                    WriteStringLengthAttribute(cb, column.Length);
                }
            }
            else if (dt.IsInt)
            {
                var max = column.Precision.GetValueOrDefault() - column.Scale.GetValueOrDefault();
                if (max > 0 && max < 10)
                {
                    //int.MaxValue is 2,147,483,647 (precision 10), no need to range
                    WriteIntegerRange(cb, max);
                }
            }
            else if (dt.GetNetType() == typeof(decimal))
            {
                //[Range(typeof(decimal),"0", "999")]
                var max = column.Precision.GetValueOrDefault() - column.Scale.GetValueOrDefault();
                if (max > 0 && max < 28)
                {
                    WriteDecimalRange(cb, max);
                }
            }
        }
        public void Composite_foreign_key()

        {
            var ida = new DatabaseColumn {
                Name = "Id_A", StoreType = "int"
            };
            var idb = new DatabaseColumn {
                Name = "Id_B", StoreType = "int"
            };
            var parentTable = new DatabaseTable
            {
                Name    = "Parent",
                Columns =
                {
                    ida,
                    idb
                },
                PrimaryKey = new DatabasePrimaryKey
                {
                    Columns = { ida, idb }
                }
            };
            var childrenTable = new DatabaseTable
            {
                Name    = "Children",
                Columns =
                {
                    IdColumn,
                    new DatabaseColumn {
                        Name = "ParentId_A",StoreType                 = "int"
                    },
                    new DatabaseColumn {
                        Name = "ParentId_B",StoreType                 = "int"
                    }
                },
                PrimaryKey = IdPrimaryKey
            };

            childrenTable.ForeignKeys.Add(
                new DatabaseForeignKey
            {
                Table          = childrenTable,
                PrincipalTable = parentTable,
                OnDelete       = ReferentialAction.SetNull,
                Columns        =
                {
                    childrenTable.Columns.ElementAt(1),
                    childrenTable.Columns.ElementAt(2)
                },
                PrincipalColumns =
                {
                    parentTable.Columns.ElementAt(0),
                    parentTable.Columns.ElementAt(1)
                }
            });

            var model = _factory.Create(new DatabaseModel {
                Tables = { parentTable, childrenTable }
            });

            var parent = (EntityType)model.FindEntityType("Parent");

            var children = (EntityType)model.FindEntityType("Children");

            Assert.NotEmpty(parent.GetReferencingForeignKeys());

            var fk = Assert.Single(children.GetForeignKeys());

            Assert.False(fk.IsUnique);
            Assert.Equal(DeleteBehavior.SetNull, fk.DeleteBehavior);

            var principalKey = fk.PrincipalKey;

            Assert.Equal("Parent", principalKey.DeclaringEntityType.Name);
            Assert.Equal("IdA", principalKey.Properties[0].Name);
            Assert.Equal("IdB", principalKey.Properties[1].Name);
        }
        public void CreateFileCompare(StreamWriter sw, DatabaseTable table)
        {
            string tableName = table.TableName;

            sw.WriteLine();

            var headerFile = new StringBuilder();

            headerFile.AppendLine(@"using System;
                                    using System.Collections.Generic;
                                    using System.Linq;
                                    using Anotar.NLog;
                                    using Nexus.Entity;
                                    using Nexus.Common.Enum;
                                    using Nexus.Entity.Entities;
                                    using Nexus.Memory;
                                    using Nexus.Worker.CommunicationMemory.Utils;");
            headerFile.AppendLine("namespace Nexus.Worker.CommunicationMemory.ProcessCheck.FunctionCheckMemory");
            headerFile.AppendLine("{");
            var endFile = new StringBuilder();

            endFile.AppendLine("}");

            var headerclassBuilder = new StringBuilder();

            headerclassBuilder.AppendLine("public class CheckMemory" + tableName);
            headerclassBuilder.AppendLine("{");
            var endclassBuilder = new StringBuilder();

            endclassBuilder.AppendLine("}");


            sw.WriteLine(headerFile.ToString());
            sw.WriteLine(headerclassBuilder.ToString());
            //Insert func ở đây
            #region Lấy keyName
            string keyName    = "";
            int    count      = table.Columns.Count;
            var    listColums = new List <DatabaseColumn>();
            for (int i = 0; i < count; i++)
            {
                DatabaseColumn column = table.Columns[i];
                if (column.IsPK || column.IsFK)
                {
                    listColums.Add(column);
                }
            }

            if (listColums.Count == 1)
            {
                //TH có 1 key thì key là kiểu dữ liệu (string, long,..)
                DatabaseColumn column = listColums[0];
                keyName = column.Name;
            }
            else if (listColums.Count > 1)
            {
                //Trường hợp lớn hơn 1 key  (GoldPositionMemberKeys)
                keyName = tableName + "Keys";
            }
            #endregion

            sw.WriteLine(FunctionBuild_CheckInfo(tableName, keyName));
            sw.WriteLine(FunctionBuild_CompareInfo(table));

            //End insert func
            sw.WriteLine(endclassBuilder.ToString());
            sw.WriteLine(endFile.ToString());
            sw.WriteLine();
        }
        /// <summary>
        /// Gets the MySql datatype definition as string
        /// </summary>
        /// <param name="column">The column.</param>
        /// <returns></returns>
        public string WriteDataType(DatabaseColumn column)
        {
            if (column == null)
            {
                return(string.Empty);
            }
            if (string.IsNullOrEmpty(column.DbDataType))
            {
                return(string.Empty);
            }
            //we don't do column.DbDataTypeStandard() as native types will have length/precision-scale
            //and also ints will have the UNSIGNED marker
            //These types will fall through unchanged.
            var dataType = column.DbDataType.ToUpperInvariant();
            //int providerType = -1;
            //if (column.DataType != null)
            //    providerType = column.DataType.ProviderDbType;

            var precision = column.Precision;
            var scale     = column.Scale;
            var length    = column.Length;

            //oracle to MySql translation
            if (dataType == "NUMBER")
            {
                dataType = DataTypeConverter.OracleNumberConversion(precision, scale);
            }
            if (dataType.StartsWith("TIMESTAMP", StringComparison.OrdinalIgnoreCase) &&
                DataTypeConverter.IsSqlServerTimestamp(dataType, column))
            {
                dataType = "TINYBLOB"; //there's no equivalent really
            }

            if (dataType == "VARCHAR2" || dataType == "NVARCHAR" || dataType == "NVARCHAR2")
            {
                dataType = ConvertString(length);
            }
            else if (dataType == "CLOB" || dataType == "NTEXT")
            {
                dataType = "LONGTEXT";
            }
            else if (dataType == "NCHAR")
            {
                dataType = "CHAR";
            }
            else if (dataType == "DATETIME2" || dataType == "TIME")
            {
                dataType = "DATETIME";
            }
            else if (dataType == "MONEY")
            {
                dataType  = "DECIMAL";
                precision = 19;
                scale     = 4;
            }
            else if (dataType == "BIT")
            {
                dataType = "TINYINT";
            }

            else if (dataType == "IMAGE" || dataType == "VARBINARY")
            {
                dataType = ConvertBlob(length);
            }
            else if (dataType == "UNIQUEIDENTIFIER")
            {
                dataType = "VARCHAR";
                length   = 64;
            }
            else if (dataType == "XML" || dataType == "XMLTYPE")
            {
                dataType = "TEXT";
            }
            //write out MySql datatype definition
            if (dataType == "VARCHAR" ||
                dataType == "CHAR" ||
                dataType == "BINARY" ||
                dataType == "VARBINARY")
            {
                dataType = dataType + " (" + length + ")";
            }

            if (dataType == "NUMERIC" ||
                dataType == "DECIMAL")
            {
                var writeScale = ((scale != null) && (scale > 0) ? "," + scale : "");
                dataType = dataType + " (" + precision + writeScale + ")";
            }

            return(dataType);
        }
        public void Correct_arguments_to_scaffolding_typemapper()
        {
            var principalPkColumn = new DatabaseColumn {
                Name = "PrimaryKey", StoreType = "nvarchar(450)"
            };
            var principalAkColumn = new DatabaseColumn {
                Name = "AlternateKey", StoreType = "nvarchar(450)"
            };
            var principalIndexColumn = new DatabaseColumn {
                Name = "Index", StoreType = "nvarchar(450)"
            };
            var rowversionColumn = new DatabaseColumn
            {
                Name           = "Rowversion",
                StoreType      = "rowversion",
                ValueGenerated = ValueGenerated.OnAddOrUpdate,
                [ScaffoldingAnnotationNames.ConcurrencyToken] = true
            };

            var principalTable = new DatabaseTable
            {
                Name    = "Principal",
                Columns =
                {
                    principalPkColumn,
                    principalAkColumn,
                    principalIndexColumn,
                    rowversionColumn
                },
                PrimaryKey = new DatabasePrimaryKey {
                    Columns = { principalPkColumn }
                },
                UniqueConstraints = { new DatabaseUniqueConstraint {
                                          Columns =                { principalAkColumn}
                                      } },
                Indexes = { new DatabaseIndex {
                                Columns =     { principalIndexColumn}
                            } }
            };

            var dependentIdColumn = new DatabaseColumn {
                Name = "Id", StoreType = "int"
            };
            var dependentFkColumn = new DatabaseColumn {
                Name = "BlogAlternateKey", StoreType = "nvarchar(450)"
            };

            var dependentTable = new DatabaseTable
            {
                Name    = "Dependent",
                Columns =
                {
                    dependentIdColumn,
                    dependentFkColumn
                },
                PrimaryKey = new DatabasePrimaryKey {
                    Columns = { dependentIdColumn }
                },
                Indexes = { new DatabaseIndex {
                                Columns =     { dependentFkColumn}
                            } },
                ForeignKeys =
                {
                    new DatabaseForeignKey
                    {
                        Columns          = { dependentFkColumn },
                        PrincipalTable   = principalTable,
                        PrincipalColumns ={ principalAkColumn                        }
                    }
                }
            };

            var dbModel = new DatabaseModel
            {
                Tables = { principalTable, dependentTable }
            };

            var model = _factory.Create(dbModel);

            Assert.Null(model.FindEntityType("Principal").FindProperty("PrimaryKey").Relational().ColumnType);
            Assert.Null(model.FindEntityType("Principal").FindProperty("AlternateKey").Relational().ColumnType);
            Assert.Null(model.FindEntityType("Principal").FindProperty("Index").Relational().ColumnType);
            Assert.Null(model.FindEntityType("Principal").FindProperty("Rowversion").Relational().ColumnType);
            Assert.Null(model.FindEntityType("Dependent").FindProperty("BlogAlternateKey").Relational().ColumnType);
        }
Esempio n. 9
0
        private void GetColumns(
            DbConnection connection,
            IReadOnlyList <DatabaseTable> tables,
            Func <string, string, bool> tableFilter)
        {
            foreach (var table in tables)
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = string.Format(GetColumnsQuery, table.Name);
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var name         = reader.GetValueOrDefault <string>("COLUMN_NAME");
                            var defaultValue = reader.GetValueOrDefault <string>("COLUMN_DEFAULT");
                            var nullable     = reader.GetBoolean("IS_NULLABLE");
                            var dataType     = reader.GetValueOrDefault <string>("DATA_TYPE");
                            var charset      = reader.GetValueOrDefault <string>("CHARACTER_SET_NAME");
                            var collation    = reader.GetValueOrDefault <string>("COLLATION_NAME");
                            var columType    = reader.GetValueOrDefault <string>("COLUMN_TYPE");
                            var extra        = reader.GetValueOrDefault <string>("EXTRA");
                            var comment      = reader.GetValueOrDefault <string>("COLUMN_COMMENT");

                            ValueGenerated valueGenerated;

                            if (extra.IndexOf("auto_increment", StringComparison.Ordinal) >= 0)
                            {
                                valueGenerated = ValueGenerated.OnAdd;
                            }
                            else if (extra.IndexOf("on update", StringComparison.Ordinal) >= 0)
                            {
                                if (defaultValue != null &&
                                    (extra.IndexOf(defaultValue, StringComparison.Ordinal) > 0 ||
                                     string.Equals(dataType, "timestamp", StringComparison.OrdinalIgnoreCase) &&
                                     extra.IndexOf("CURRENT_TIMESTAMP", StringComparison.Ordinal) > 0))
                                {
                                    valueGenerated = ValueGenerated.OnAddOrUpdate;
                                }
                                else
                                {
                                    // BUG: EF Core does not handle code generation for `OnUpdate`.
                                    //      Instead, it just generates an empty method call ".()".
                                    //      Tracked by: https://github.com/aspnet/EntityFrameworkCore/issues/18579
                                    //
                                    //      As a partial workaround, use `OnAddOrUpdate`, if a default value
                                    //      has been specified.

                                    if (defaultValue != null)
                                    {
                                        valueGenerated = ValueGenerated.OnAddOrUpdate;
                                    }
                                    else
                                    {
                                        valueGenerated = ValueGenerated.OnUpdate;
                                    }
                                }
                            }
                            else
                            {
                                valueGenerated = ValueGenerated.Never;
                            }

                            defaultValue = FilterClrDefaults(dataType, nullable, defaultValue);

                            var column = new DatabaseColumn
                            {
                                Table           = table,
                                Name            = name,
                                StoreType       = columType,
                                IsNullable      = nullable,
                                DefaultValueSql = CreateDefaultValueString(defaultValue, dataType),
                                ValueGenerated  = valueGenerated,
                                Comment         = string.IsNullOrEmpty(comment) ? null : comment,
                                [MySqlAnnotationNames.CharSet]   = _settings.CharSet ? charset : null,
                                [MySqlAnnotationNames.Collation] = _settings.Collation ? collation : null,
                            };

                            table.Columns.Add(column);
                        }
                    }
                }
            }
        }
Esempio n. 10
0
        private void GetColumns()
        {
            var command = _connection.CreateCommand();

            command.CommandText = @"SELECT 
		   NULL [schema]
       ,   c.TABLE_NAME  [table]
	   ,   c.DATA_TYPE [typename]
       ,   c.COLUMN_NAME [column_name]
       ,   CAST(c.ORDINAL_POSITION as integer) [ordinal]
       ,   CAST(CASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [nullable]
	   ,   ix.ORDINAL_POSITION as [primary_key_ordinal]
	   ,   RTRIM(LTRIM(c.COLUMN_DEFAULT)) as [default_sql]
	   ,   c.NUMERIC_PRECISION [precision]
	   ,   c.NUMERIC_SCALE [scale]
       ,   c.CHARACTER_MAXIMUM_LENGTH [max_length]
       ,   CAST(CASE WHEN c.AUTOINC_INCREMENT IS NULL THEN 0 ELSE 1 END AS bit) [is_identity]
       ,   CAST(CASE WHEN c.DATA_TYPE = 'rowversion' THEN 1 ELSE 0 END AS bit) [is_computed]       
       FROM
       INFORMATION_SCHEMA.COLUMNS c
       INNER JOIN
       INFORMATION_SCHEMA.TABLES t ON
       c.TABLE_NAME = t.TABLE_NAME
       LEFT JOIN INFORMATION_SCHEMA.INDEXES ix
       ON c.TABLE_NAME = ix.TABLE_NAME AND c.COLUMN_NAME = ix.COLUMN_NAME AND ix.PRIMARY_KEY = 1
       WHERE SUBSTRING(c.COLUMN_NAME, 1,5) != '__sys'
       AND t.TABLE_TYPE = 'TABLE' 
       AND (SUBSTRING(t.TABLE_NAME, 1,2) <> '__')
       ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION;";

            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    var tableName         = reader.GetValueOrDefault <string>("table");
                    var dataTypeName      = reader.GetValueOrDefault <string>("typename");
                    var nullable          = reader.GetValueOrDefault <bool>("nullable");
                    var precision         = reader.IsDBNull(8) ? default(int?) : Convert.ToInt32(reader[8], System.Globalization.CultureInfo.InvariantCulture);
                    var scale             = reader.IsDBNull(9) ? default(int?) : Convert.ToInt32(reader[9], System.Globalization.CultureInfo.InvariantCulture);
                    var maxLength         = reader.GetValueOrDefault <int?>("max_length");
                    var ordinal           = reader.GetValueOrDefault <int?>("ordinal");
                    var primaryKeyOrdinal = reader.GetValueOrDefault <int?>("primary_key_ordinal");
                    var columnName        = reader.GetValueOrDefault <string>("column_name");
                    var defaultValue      = reader.GetValueOrDefault <string>("default_sql");
                    var isIdentity        = reader.GetValueOrDefault <bool>("is_identity");

                    Logger.ColumnFound(tableName, columnName, dataTypeName, nullable, defaultValue);

                    if (!AllowsTable(tablesToSelect, selectedTables, tableName))
                    {
                        //Logger.ColumnSkipped(DisplayName(schemaName, tableName), columnName);
                        continue;
                    }

                    if (!_tables.TryGetValue(TableKey(tableName), out var table))
                    {
                        Logger.MissingTableWarning(tableName);
                        continue;
                    }

                    var storeType = GetStoreType(dataTypeName, precision, scale, maxLength);

                    defaultValue = FilterClrDefaults(dataTypeName, nullable, defaultValue);

                    var isComputed = reader.GetValueOrDefault <bool>("is_computed");

                    var column = new DatabaseColumn
                    {
                        Table           = table,
                        StoreType       = storeType,
                        Name            = columnName,
                        IsNullable      = nullable,
                        DefaultValueSql = defaultValue,
                        ValueGenerated  = isIdentity ?
                                          ValueGenerated.OnAdd :
                                          isComputed
                                ? ValueGenerated.OnAddOrUpdate
                                : default(ValueGenerated?)
                    };

                    if ((storeType) == "rowversion")
                    {
                        column["ConcurrencyToken"] = true;
                    }

                    table.Columns.Add(column);
                    _tableColumns.Add(ColumnKey(table, column.Name), column);
                }
            }
        }
Esempio n. 11
0
        public static ITable ToSchemaTable(this Type type, IDataProvider provider)
        {
            string tableName = type.Name;

            tableName = tableName.MakePlural();
            var result = new DatabaseTable(tableName, provider);

            result.ClassName = type.Name;

            var typeAttributes = type.GetCustomAttributes(typeof(IClassMappingAttribute), false);

            foreach (IClassMappingAttribute attr in typeAttributes)
            {
                if (attr.Accept(result))
                {
                    attr.Apply(result);
                }
            }

            var props = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);

            foreach (var prop in props)
            {
                if (prop.GetSetMethod() == null)
                {
                    continue;
                }

                var attributes = prop.GetCustomAttributes(false);
                if (ColumnIsIgnored(attributes))
                {
                    continue;
                }

                if (CanGenerateSchemaFor(prop.PropertyType))
                {
                    var column = new DatabaseColumn(prop.Name, result);
                    column.PropertyName = prop.Name;
                    bool isNullable = prop.PropertyType.Name.Contains("Nullable");

                    column.DataType = IdentifyColumnDataType(prop.PropertyType, isNullable);

                    if (column.DataType == DbType.Decimal || column.DataType == DbType.Double)
                    {
                        //default to most common;
                        column.NumberScale      = 2;
                        column.NumericPrecision = 16;
                    }

                    /*else if(column.DataType == DbType.String)
                     * {
                     *  column.MaxLength = 255;
                     * }*/
                    else if (column.DataType == DbType.Binary)
                    {
                        isNullable = true;
                    }

                    if (isNullable)
                    {
                        column.IsNullable = true;
                    }

                    // Now work with attributes
                    foreach (IPropertyMappingAttribute attr in attributes.Where(x => x is IPropertyMappingAttribute))
                    {
                        if (attr.Accept(column))
                        {
                            attr.Apply(column);
                        }
                    }

                    result.Columns.Add(column);
                }
                else if (IsRelationColumm(attributes))
                {
                    if (!IsPropertyDeclaredVirtual(prop))
                    {
                        throw new InvalidOperationException(String.Format(
                                                                "Property {0} of type {1} marked as relation must be declared virtual to allow dynamic proxy mechanisms work correctly!",
                                                                prop.Name, prop.DeclaringType.Name));
                    }

                    var innerProp = prop;

                    result.AddRelation(() =>
                    {
                        var relation = new DatabaseRelation(innerProp.Name, result);

                        foreach (IRelationMappingAttribute attr in attributes.Where(x => x is IRelationMappingAttribute))
                        {
                            if (attr.Accept(relation, innerProp))
                            {
                                attr.Apply(relation, innerProp);
                            }
                        }

                        return(relation);
                    });
                }
            }

            //if the PK is still null-look for a column called [tableName]ID - if it's there then make it PK
            if (result.PrimaryKey == null)
            {
                var pk = (result.GetColumn(type.Name + "ID") ?? result.GetColumn("ID")) ?? result.GetColumn("Key");

                if (pk != null)
                {
                    pk.IsPrimaryKey = true;
                    //if it's an INT then AutoIncrement it
                    if (pk.IsNumeric)
                    {
                        pk.AutoIncrement = true;
                    }
                    else if (pk.IsString && pk.MaxLength == 0)
                    {
                        pk.MaxLength = 255;
                    }
                    //} else {
                    //    pk = new DatabaseColumn(type.ColumnName + "ID", result);
                    //    pk.DataType = DbType.Int32;
                    //    pk.IsPrimaryKey = true;
                    //    pk.AutoIncrement = true;
                    //    result.Columns.Insert(0, pk);
                }
            }

            //we should have a PK at this point
            //if not, throw :)
            if (result.PrimaryKey == null)
            {
                throw new InvalidOperationException("Can't decide which property to consider the Key - you can create one called 'ID' or mark one with SubSonicPrimaryKey attribute");
            }
            return(result);
        }
        private bool ComparePropertyToColumn(CompareLogger logger, IProperty property, DatabaseColumn column)
        {
            var pRel  = property.Relational();;
            var error = logger.CheckDifferent(pRel.ColumnType, column.StoreType, CompareAttributes.ColumnType, _caseComparison);

            error |= logger.CheckDifferent(property.IsNullable.NullableAsString(), column.IsNullable.NullableAsString(), CompareAttributes.Nullability, _caseComparison);
            error |= logger.CheckDifferent(pRel.ComputedColumnSql.RemoveUnnecessaryBrackets(),
                                           column.ComputedColumnSql.RemoveUnnecessaryBrackets(), CompareAttributes.ComputedColumnSql, _caseComparison);
            var defaultValue = pRel.DefaultValueSql ?? pRel.DefaultValue?.ToString();

            error |= logger.CheckDifferent(defaultValue.RemoveUnnecessaryBrackets(),
                                           column.DefaultValueSql.RemoveUnnecessaryBrackets(), CompareAttributes.DefaultValueSql, _caseComparison);
            error |= CheckValueGenerated(logger, property, column);
            return(error);
        }
Esempio n. 13
0
        public void CreateFile(string folderPath, string fileName, List <DatabaseTable> listTable)
        {
            try
            {
                listTable.Sort((l, r) => String.Compare(l.TableName, r.TableName, StringComparison.Ordinal));
                var stringBuild = new StringBuilder();
                var headerFile  = new StringBuilder();
                headerFile.AppendLine(@"using System;
                                        using System.Collections.Generic;
                                        using System.Globalization;
                                        using Nexus.Entity.Keys;
                                        using System.Linq;
                                        using Nexus.Common.Enum;
                                        using Nexus.Entity.Entities;
                                        ");
                headerFile.AppendLine("namespace Nexus.Memory");
                headerFile.AppendLine("{");
                var endFile = new StringBuilder();
                endFile.AppendLine("}");


                var headerclassBuilder = new StringBuilder();
                headerclassBuilder.AppendLine("public partial class MemoryInfo : Memory");
                headerclassBuilder.AppendLine("{");
                var endclassBuilder = new StringBuilder();
                endclassBuilder.AppendLine("}");

                stringBuild.Append(headerFile.ToString());
                stringBuild.Append(headerclassBuilder.ToString());

                foreach (var table in listTable)
                {
                    if (table.IsSelected)
                    {
                        string tableName = table.TableName;

                        string keyName    = "";
                        int    count      = table.Columns.Count;
                        var    listColums = new List <DatabaseColumn>();
                        for (int i = 0; i < count; i++)
                        {
                            DatabaseColumn column = table.Columns[i];
                            if (column.IsPK || column.IsFK)
                            {
                                listColums.Add(column);
                            }
                        }

                        if (listColums.Count == 1)
                        {
                            //TH có 1 key thì key là text của object đó ví dụ ClientOrderId của BrokerOrder
                            DatabaseColumn column = listColums[0];
                            keyName = column.Name;
                        }
                        else if (listColums.Count > 1)
                        {
                            //Trường hợp lớn hơn 1 key  (GoldPositionMemberKeys)
                            keyName = tableName + "Keys";
                        }

                        stringBuild.AppendLine(FunctionBuild_GetMemory(tableName, keyName).ToString());
                    }
                }

                //End insert func
                stringBuild.Append(endclassBuilder.ToString());
                stringBuild.Append(endFile.ToString());
                stringBuild.AppendLine();

                //Lưu vào thư mục build
                using (var sw = new StreamWriter(folderPath + fileName))
                {
                    sw.WriteLine(stringBuild.ToString());
                    sw.Close();
                }
                //Lưu vào thư mục foudation nếu có
                if (!string.IsNullOrEmpty(ConfigGlobal.SettingConfig.Setting_MemoryWorkerBase) && ConfigGlobal.SettingConfig.Setting_CheckGenByForder)
                {
                    string fileCs = ConfigGlobal.SettingConfig.Setting_MemoryWorkerBase + "\\" + fileName;
                    if (File.Exists(fileCs))
                    {
                        //Tồn tại mới lưu
                        File.Delete(fileCs);
                        using (var sw = new StreamWriter(fileCs))
                        {
                            sw.WriteLine(stringBuild.ToString());
                            sw.Close();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }
        public override string AlterColumn(DatabaseTable databaseTable, DatabaseColumn databaseColumn, DatabaseColumn originalColumn)
        {
            var tableGenerator = CreateTableGenerator(databaseTable);

            if (!AlterColumnIncludeDefaultValue)
            {
                tableGenerator.IncludeDefaultValues = false;
            }
            var columnDefinition   = tableGenerator.WriteColumn(databaseColumn).Trim();
            var originalDefinition = "?";

            if (originalColumn != null)
            {
                originalDefinition = tableGenerator.WriteColumn(originalColumn).Trim();
                //we don't specify "NULL" for nullables in tableGenerator, but if it's changed we should
                if (originalColumn.Nullable && !databaseColumn.Nullable)
                {
                    originalDefinition += " NULL";
                }
                if (!originalColumn.Nullable && databaseColumn.Nullable)
                {
                    columnDefinition += " NULL";
                }
            }
            if (originalDefinition.Equals(columnDefinition))
            {
                //most likely faulty sql db structure, skip
                //add a nice comment
                return(string.Format(CultureInfo.InvariantCulture,
                                     "-- skipping alter of {0} from {1} to {2}",
                                     databaseTable.Name,
                                     originalDefinition,
                                     columnDefinition));
            }
            StringBuilder sb = new StringBuilder();

            sb.AppendLine(string.Format("--TO CHANGE COLUMN {0} to {1}, WE CREATE BACKUP, MOVE CONTENT AND RENAME TABLE " + LineEnding(), originalDefinition, columnDefinition));

            DatabaseTable tempTable = databaseTable.Clone("bkup1903_" + databaseTable.Name);

            tempTable.Columns.Remove(tempTable.FindColumn(originalColumn == null ? databaseColumn.Name : originalColumn.Name));
            tempTable.Columns.Add(databaseColumn);
            sb.Append(BackupAndUpdateTable(databaseTable, tempTable));
            return(sb.ToString());
        }
Esempio n. 15
0
        /// <summary>
        /// Gets the SQLServer datatype definition as string
        /// </summary>
        /// <param name="column">The column.</param>
        /// <returns></returns>
        public virtual string WriteDataType(DatabaseColumn column)
        {
            if (column == null)
            {
                return(string.Empty);
            }
            if (string.IsNullOrEmpty(column.DbDataType))
            {
                return(string.Empty);
            }
            var dataType = column.DbDataTypeStandard();

            int providerType = -1;

            if (column.DataType != null)
            {
                providerType = column.DataType.ProviderDbType;
            }

            var precision = column.Precision;
            var scale     = column.Scale;
            var length    = column.Length;

            //oracle to sql server translation
            if (dataType == "BLOB")
            {
                dataType = "VARBINARY";
                length   = -1;
            }
            if (dataType == "CLOB")
            {
                dataType = "NVARCHAR";
                length   = -1;
            }

            //In SqlServer, the maximum length allowed for any data type is 8000.
            //Ergo, TEXTs and NTEXTs that are larger (int.MaxValue or int.MaxValue/2) must be SqlServer types
            if (dataType == "NTEXT" && length > 8000)
            {
                return("NTEXT");
            }
            if (dataType == "TEXT" && length > 8000)
            {
                return("TEXT");
            }
            if (_originSqlType == SqlType.SqlServer || _originSqlType == SqlType.SqlServerCe)
            {
                if (dataType == "BINARY")
                {
                    //should not be varbinary
                    return(WriteDataTypeWithLength(dataType, length));
                }
            }
            else
            {
                dataType = ConvertOtherPlatformTypes(dataType, providerType, length, precision, scale);
            }

            if ((dataType == "DATETIME2" || dataType == "TIME") && column.DateTimePrecision.HasValue)
            {
                dataType = dataType + "(" + column.DateTimePrecision + ")";
            }

            //write out SqlServer datatype definition
            if (dataType == "NVARCHAR" ||
                dataType == "VARCHAR" ||
                dataType == "CHAR" ||
                dataType == "NCHAR" ||
                dataType == "BINARY" ||
                dataType == "VARBINARY")
            {
                dataType = WriteDataTypeWithLength(dataType, length);
            }

            if (dataType == "NUMERIC" ||
                dataType == "DECIMAL")
            {
                if (precision != null)
                {
                    var writeScale = ((scale != null) && (scale > 0) ? "," + scale : "");
                    dataType = dataType + " (" + precision + writeScale + ")";
                }
            }

            return(dataType);
        }
        /// <summary>
        ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
        ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
        ///     any release. You should only use it directly in your code with extreme caution and knowing that
        ///     doing so can result in application failures when updating to a new Entity Framework Core release.
        /// </summary>
        protected virtual PropertyBuilder VisitColumn([NotNull] EntityTypeBuilder builder, [NotNull] DatabaseColumn column)
        {
            Check.NotNull(builder, nameof(builder));
            Check.NotNull(column, nameof(column));

            var typeScaffoldingInfo = GetTypeScaffoldingInfo(column);

            if (typeScaffoldingInfo == null)
            {
                _unmappedColumns.Add(column);
                _reporter.WriteWarning(
                    DesignStrings.CannotFindTypeMappingForColumn(column.DisplayName(), column.StoreType));
                return(null);
            }

            var clrType = typeScaffoldingInfo.ClrType;

            if (column.IsNullable)
            {
                clrType = clrType.MakeNullable();
            }

            if (clrType == typeof(bool) &&
                column.DefaultValueSql != null)
            {
                _reporter.WriteWarning(
                    DesignStrings.NonNullableBoooleanColumnHasDefaultConstraint(column.DisplayName()));

                clrType = clrType.MakeNullable();
            }

            var property = builder.Property(clrType, GetPropertyName(column));

            property.HasColumnName(column.Name);

            if (!typeScaffoldingInfo.IsInferred &&
                !string.IsNullOrWhiteSpace(column.StoreType))
            {
                property.HasColumnType(column.StoreType);
            }

            if (typeScaffoldingInfo.ScaffoldUnicode.HasValue)
            {
                property.IsUnicode(typeScaffoldingInfo.ScaffoldUnicode.Value);
            }

            if (typeScaffoldingInfo.ScaffoldFixedLength == true)
            {
                property.IsFixedLength();
            }

            if (typeScaffoldingInfo.ScaffoldMaxLength.HasValue)
            {
                property.HasMaxLength(typeScaffoldingInfo.ScaffoldMaxLength.Value);
            }

            if (column.ValueGenerated == ValueGenerated.OnAdd)
            {
                property.ValueGeneratedOnAdd();
            }

            if (column.ValueGenerated == ValueGenerated.OnUpdate)
            {
                property.ValueGeneratedOnUpdate();
            }

            if (column.ValueGenerated == ValueGenerated.OnAddOrUpdate)
            {
                property.ValueGeneratedOnAddOrUpdate();
            }

            if (column.DefaultValueSql != null)
            {
                property.HasDefaultValueSql(column.DefaultValueSql);
            }

            if (column.ComputedColumnSql != null)
            {
                property.HasComputedColumnSql(column.ComputedColumnSql);
            }

            if (column.Comment != null)
            {
                property.HasComment(column.Comment);
            }

            if (!(column.Table.PrimaryKey?.Columns.Contains(column) ?? false))
            {
                property.IsRequired(!column.IsNullable);
            }

            if ((bool?)column[ScaffoldingAnnotationNames.ConcurrencyToken] == true)
            {
                property.IsConcurrencyToken();
            }

            property.Metadata.SetColumnOrdinal(column.Table.Columns.IndexOf(column));

            property.Metadata.AddAnnotations(
                column.GetAnnotations().Where(
                    a => a.Name != ScaffoldingAnnotationNames.ConcurrencyToken));

            return(property);
        }
Esempio n. 17
0
        private static string OtherDatabaseTypesToPostgreSql(string dataType, DatabaseColumn column)
        {
            //string types
            //character(n) (aka char(n)) character varying(n) aka varchar(n) and text
            if (DataTypeConverter.IsFixedLengthString(dataType))
            {
                return("CHAR");
            }
            if (DataTypeConverter.IsLongString(dataType))
            {
                return("TEXT");
            }
            if (DataTypeConverter.IsVariableString(dataType))
            {
                if (column.Length == -1)
                {
                    return("TEXT");
                }
                return("VARCHAR");
            }

            //numeric types
            if (dataType == "INT")
            {
                return("INTEGER");
            }
            if (dataType == "INT4")
            {
                return("INTEGER");                    //this is a PostgreSql alias, we'll use standard SQL
            }
            //else if (dataType == "SERIAL") return "INTEGER"; //this is a PostgreSql alias, we'll use standard SQL
            //else if (dataType == "BIGSERIAL") return "BIGINT"; //this is a PostgreSql alias, we'll use standard SQL
            if (dataType == "INT8")
            {
                return("BIGINT");                    //this is a PostgreSql alias, we'll use standard SQL
            }
            if (dataType == "INT2")
            {
                return("SMALLINT");                    //this is a PostgreSql alias, we'll use standard SQL
            }
            if (dataType == "TINYINT")
            {
                return("SMALLINT");                       //this is a MsSql alias, we'll use standard SQL
            }
            if (dataType == "NUMBER")
            {
                return(DataTypeConverter.OracleNumberConversion(column.Precision, column.Scale));
            }

            //float and real
            if (dataType == "FLOAT4")
            {
                return("REAL");                      //this is a PostgreSql alias, we'll use standard SQL
            }
            if (dataType == "FLOAT")
            {
                return("DOUBLE PRECISION");
            }

            //date times
            //SqlServer Timestamp is a binary
            if (DataTypeConverter.IsSqlServerTimestamp(dataType, column))
            {
                return("BYTEA"); //this is just a byte array- functionally you should redesign the table and perhaps use the system extension columns
            }
            if (DataTypeConverter.IsDateTime(dataType))
            {
                return("TIMESTAMP");
            }

            //bytes
            if (DataTypeConverter.IsBlob(dataType, column))
            {
                return("OID");//blobs become object ids
            }
            if (DataTypeConverter.IsBinary(dataType))
            {
                return("BYTEA");
            }

            //there is a native BIT(n) type in Postgresql, but in conversion we probably mean boolean.
            if (dataType == "BIT" && !column.Length.HasValue)
            {
                return("BOOLEAN");
            }

            //other types
            if (dataType == "XMLTYPE")
            {
                return("XML");
            }
            if (dataType == "UNIQUEIDENTIFIER")
            {
                return("UUID");
            }
            return(dataType);
        }
        public void Indexes_and_alternate_keys()
        {
            var c1 = new DatabaseColumn {
                Name = "C1", StoreType = "int"
            };
            var table = new DatabaseTable
            {
                Name    = "T",
                Columns =
                {
                    c1,
                    new DatabaseColumn {
                        Name = "C2",StoreType               = "int"
                    },
                    new DatabaseColumn {
                        Name = "C3",StoreType               = "int"
                    }
                },
                PrimaryKey = new DatabasePrimaryKey
                {
                    Columns = { c1 }
                }
            };

            table.Indexes.Add(
                new DatabaseIndex
            {
                Name     = "IDX_C1",
                Columns  = { table.Columns.ElementAt(0) },
                IsUnique = false
            });
            table.Indexes.Add(
                new DatabaseIndex
            {
                Name     = "UNQ_C2",
                Columns  = { table.Columns.ElementAt(1) },
                IsUnique = true
            });
            table.Indexes.Add(
                new DatabaseIndex
            {
                Name    = "IDX_C2_C1",
                Columns =
                {
                    table.Columns.ElementAt(1),
                    table.Columns.ElementAt(0)
                },
                IsUnique = false
            });
            table.Indexes.Add(
                new DatabaseIndex
            {
                /*Name ="UNQ_C3_C1",*/
                Columns =
                {
                    table.Columns.ElementAt(2),
                    table.Columns.ElementAt(0)
                },
                IsUnique = true
            });

            var info = new DatabaseModel {
                Tables = { table }
            };

            var entityType = (EntityType)_factory.Create(info).GetEntityTypes().Single();

            Assert.Collection(
                entityType.GetIndexes(),
                indexColumn1 =>
            {
                Assert.False(indexColumn1.IsUnique);
                Assert.Equal("IDX_C1", indexColumn1.Relational().Name);
                Assert.Same(entityType.FindProperty("C1"), indexColumn1.Properties.Single());
            },
                uniqueColumn2 =>
            {
                Assert.True(uniqueColumn2.IsUnique);
                Assert.Same(entityType.FindProperty("C2"), uniqueColumn2.Properties.Single());
            },
                indexColumn2Column1 =>
            {
                Assert.False(indexColumn2Column1.IsUnique);
                Assert.Equal(new[] { "C2", "C1" }, indexColumn2Column1.Properties.Select(c => c.Name).ToArray());
            },
                uniqueColumn3Column1 =>
            {
                Assert.True(uniqueColumn3Column1.IsUnique);
                Assert.Equal(new[] { "C3", "C1" }, uniqueColumn3Column1.Properties.Select(c => c.Name).ToArray());
            }
                );

            // unique indexes should not cause alternate keys if not used by foreign keys
            Assert.Equal(0, entityType.GetKeys().Count(k => !k.IsPrimaryKey()));
        }
Esempio n. 19
0
        public string WriteDataType(DatabaseColumn column)
        {
            if (column == null)
            {
                return(string.Empty);
            }
            if (string.IsNullOrEmpty(column.DbDataType))
            {
                return(string.Empty);
            }
            var sql = string.Empty;

            var dataType  = column.DbDataTypeStandard();
            var precision = column.Precision;
            var scale     = column.Scale;
            var length    = column.Length;

            if (dataType == "BOOLEAN")
            {
                dataType  = "NUMBER";
                precision = 1;
                scale     = 0;
            }
            //sql server to oracle translation
            dataType = SqlServerToOracleConversion(dataType, GetProviderType(column), length);

            if (dataType == "UNIQUEIDENTIFIER")
            {
                dataType = "RAW";
                length   = 16;
            }
            if (dataType == "NUMERIC")
            {
                dataType = "NUMBER";
            }
            if (dataType == "INT")
            {
                dataType  = "NUMBER";
                precision = 9;
                scale     = 0;
            }
            if (dataType == "SMALLINT")
            {
                dataType  = "NUMBER";
                precision = 5;
                scale     = 0;
            }
            if (dataType == "BIT")
            {
                dataType  = "NUMBER";
                precision = 1;
                scale     = 0;
            }
            if (dataType == "DECIMAL")
            {
                dataType  = "NUMBER";
                precision = 18;
                scale     = 0;
            }
            if (dataType == "MONEY")
            {
                dataType  = "NUMBER";
                precision = 15;
                scale     = 4;
            }

            string defaultValue = FixDefaultValue(column);

            //write out Oracle datatype definition
            if (dataType == "NVARCHAR2")
            {
                if (length == -1)
                {
                    dataType = "CLOB";
                }
                else
                {
                    //don't specify "CHAR" for NVARCHAR2
                    sql = dataType + " (" + length + ")";
                    if (!string.IsNullOrEmpty(defaultValue))
                    {
                        sql += " DEFAULT " + AddQuotedDefault(defaultValue);
                    }
                }
            }
            if (dataType == "VARCHAR2")
            {
                //assume it's CHAR rather than bytes
                sql = dataType + " (" + length + " CHAR)";
                if (!string.IsNullOrEmpty(defaultValue))
                {
                    sql += " DEFAULT " + AddQuotedDefault(defaultValue);
                }
            }
            if (dataType == "CHAR" || dataType == "NCHAR")
            {
                sql = dataType + " (" + length + ")";
                if (!string.IsNullOrEmpty(defaultValue))
                {
                    sql += " DEFAULT " + AddQuotedDefault(defaultValue);
                }
            }
            if (dataType == "NUMBER")
            {
                if (!precision.HasValue)
                {
                    sql = "NUMBER";
                }
                else
                {
                    var writeScale = ((scale != null) && (scale > 0) ? "," + scale : "");
                    sql = "NUMBER (" + precision + writeScale + ")";
                }
                if (!column.Nullable)
                {
                    sql += " NOT NULL";
                }
                if (column.IdentityDefinition != null)
                {
                    if (column.DatabaseSchema == null ||
                        column.DatabaseSchema.Provider.IndexOf("Oracle", StringComparison.OrdinalIgnoreCase) == -1)
                    {
                        //this doesn't look like oracle, so we're converting.
                        return(sql);
                    }
                    //Oracle 12c- this can be set.
                    //For Oracle 11, IsAutoNumber can be set (by recognizing a sequence), but the definition won't be set.
                    //these must be NUMBER of some sort or it's invalid
                    sql += " GENERATED ";
                    if (column.IdentityDefinition.IdentityByDefault)
                    {
                        sql += "BY DEFAULT ";
                    }
                    sql += "AS IDENTITY";
                    if (column.IdentityDefinition.IsNonTrivialIdentity())
                    {
                        sql += string.Format(CultureInfo.InvariantCulture, " (START WITH {0} INCREMENT BY {1})",
                                             column.IdentityDefinition.IdentitySeed,
                                             column.IdentityDefinition.IdentityIncrement);
                    }
                    //no other options should be done
                    return(sql);
                }
                if (!string.IsNullOrEmpty(defaultValue))
                {
                    sql += " DEFAULT " + defaultValue;
                }
                return(sql);
            }
            if (dataType == "REAL")
            {
                sql = "REAL";
                if (!string.IsNullOrEmpty(defaultValue))
                {
                    sql += " DEFAULT " + defaultValue;
                }
            }
            if (dataType == "RAW")
            {
                sql = "RAW(" + length + ")";
            }
            if (dataType == "XMLTYPE")
            {
                sql = dataType;
            }

            if (dataType == "DATE")
            {
                sql = "DATE";
                if (!string.IsNullOrEmpty(defaultValue))
                {
                    sql += " DEFAULT DATE '" + defaultValue + "'";
                }
            }

            if (dataType == "TIMESTAMP")
            {
                sql = "TIMESTAMP" + (precision.HasValue ? " (" + precision + ")" : " (6)");
                if (!string.IsNullOrEmpty(defaultValue))
                {
                    sql += " DEFAULT TIMESTAMP '" + defaultValue + "'";
                }
            }

            if (dataType == "CLOB" || dataType == "NCLOB")
            {
                sql = dataType;
                if (!string.IsNullOrEmpty(defaultValue))
                {
                    sql += " DEFAULT " + AddQuotedDefault(defaultValue);
                }
            }

            if (dataType == "BLOB")
            {
                sql = dataType;
                if (!string.IsNullOrEmpty(defaultValue))
                {
                    sql += " DEFAULT " + AddQuotedDefault(defaultValue);
                }
            }
            if (column.IsComputed)
            {
                sql = "GENERATED ALWAYS AS (" + column.ComputedDefinition + ") VIRTUAL";
            }

            if (string.IsNullOrEmpty(sql))
            {
                sql = column.DbDataType;
                if (!string.IsNullOrEmpty(defaultValue))
                {
                    sql += " DEFAULT " + AddQuotedDefault(defaultValue);
                }
            }

            return(sql.TrimEnd() + (!column.Nullable ? " NOT NULL" : string.Empty));
        }
        public void Unique_index_composite_foreign_key()
        {
            var ida = new DatabaseColumn {
                Name = "Id_A", StoreType = "int"
            };
            var idb = new DatabaseColumn {
                Name = "Id_B", StoreType = "int"
            };
            var parentTable = new DatabaseTable
            {
                Name    = "Parent",
                Columns =
                {
                    ida,
                    idb
                },
                PrimaryKey = new DatabasePrimaryKey
                {
                    Columns = { ida, idb }
                }
            };
            var childrenTable = new DatabaseTable
            {
                Name    = "Children",
                Columns =
                {
                    IdColumn,
                    new DatabaseColumn {
                        Name = "ParentId_A",StoreType                 = "int"
                    },
                    new DatabaseColumn {
                        Name = "ParentId_B",StoreType                 = "int"
                    }
                },
                PrimaryKey = IdPrimaryKey
            };

            childrenTable.Indexes.Add(
                new DatabaseIndex
            {
                IsUnique = true,
                Columns  =
                {
                    childrenTable.Columns.ElementAt(1),
                    childrenTable.Columns.ElementAt(2)
                }
            });
            childrenTable.ForeignKeys.Add(
                new DatabaseForeignKey
            {
                Table          = childrenTable,
                PrincipalTable = parentTable,
                Columns        =
                {
                    childrenTable.Columns.ElementAt(1),
                    childrenTable.Columns.ElementAt(2)
                },
                PrincipalColumns =
                {
                    parentTable.Columns.ElementAt(0),
                    parentTable.Columns.ElementAt(1)
                }
            });

            var model = _factory.Create(new DatabaseModel {
                Tables = { parentTable, childrenTable }
            });
            var parent   = model.FindEntityType("Parent");
            var children = model.FindEntityType("Children");

            var fk = Assert.Single(children.GetForeignKeys());

            Assert.True(fk.IsUnique);
            Assert.Equal(parent.FindPrimaryKey(), fk.PrincipalKey);
        }
Esempio n. 21
0
 /// <summary>修改列类型、默认值、是否为NULL等
 /// 修改列类型、默认值、是否为NULL等
 /// </summary>
 /// <param name="table"></param>
 /// <param name="databaseColumn"></param>
 /// <param name="originalColumn"></param>
 /// <returns></returns>
 public string AlterColumn(DatabaseTable table, DatabaseColumn databaseColumn, DatabaseColumn originalColumn)
 {
     return(m_migrationGenerator.AlterColumn(table, databaseColumn, originalColumn));
 }
        private StringBuilder FunctionBuild_CompareInfo(DatabaseTable table)
        {
            var functionBuild = new StringBuilder();

            try
            {
                string tableName = table.TableName;

                functionBuild.AppendLine("private static string CompareInfo(" + tableName +
                                         " valueDatabase, " + tableName + " valueWorker, out string valueFail, out string keyValue)");
                functionBuild.AppendLine("{");
                functionBuild.AppendLine("valueFail = \"\";");
                functionBuild.AppendLine("keyValue = \"\";");

                int count            = table.Columns.Count;
                var listColums       = new List <DatabaseColumn>();
                var listColumsNotKey = new List <DatabaseColumn>();
                for (int i = 0; i < count; i++)
                {
                    DatabaseColumn column     = table.Columns[i];
                    string         columnName = column.Name;

                    if (column.IsPK || column.IsFK)
                    {
                        listColums.Add(column);
                    }
                    else
                    {
                        listColumsNotKey.Add(column);
                    }
                }

                if (tableName.Equals("UserRoleGroup"))
                {
                }

                //return string.Format("SymbolId and DatabaseValue ={0}. WorkerValue={1}", valueDatabase.SymbolId, valueWorker.SymbolId);
                if (listColums.Count == 1)
                {
                    string columnName = listColums[0].Name;
                    functionBuild.AppendLine("keyValue += \"" + columnName + " = \" + valueWorker." + columnName + "+\"__\";");
                    functionBuild.AppendLine("if (valueWorker." + columnName + " != valueDatabase." + columnName + ")");
                    functionBuild.AppendLine("{");
                    functionBuild.AppendLine("valueFail = string.Format(\"DatabaseValue ={0}. WorkerValue={1}\", valueDatabase." + columnName + ", valueWorker." + columnName + ");");
                    functionBuild.AppendLine("return \"" + columnName + "\";");
                    functionBuild.AppendLine("}");
                }
                else if (listColums.Count > 1)
                {
                    foreach (var column in listColums)
                    {
                        string columnName = column.Name;
                        string keyName    = tableName + "Keys";
                        columnName = keyName + "." + columnName;

                        functionBuild.AppendLine("keyValue += \"" + columnName + " = \" + valueWorker." + columnName + "+\"__\";");
                        functionBuild.AppendLine("if (valueWorker." + columnName + " != valueDatabase." + columnName + ")");
                        functionBuild.AppendLine("{");
                        functionBuild.AppendLine("valueFail = string.Format(\"DatabaseValue ={0}. WorkerValue={1}\", valueDatabase." + columnName + ", valueWorker." + columnName + ");");
                        functionBuild.AppendLine("return \"" + columnName + "\";");
                        functionBuild.AppendLine("}");
                    }
                }

                foreach (var column in listColumsNotKey)
                {
                    if (column.CSharpDataTypeName == "byte[]" ||
                        column.CSharpDataTypeName == "byte[]?")
                    {
                        continue; //Bỏ qua check trường byte
                    }
                    if (column.Name.Equals("IndexRow") &&
                        column.IsAutoNumber)
                    {
                        continue; //Bỏ qua trường index row tự tăng của linkedtransaction
                    }

                    string columnName = column.Name;

                    //Nếu là trường giá hoặc decimal thì routing 6 kí tự
                    //if (column.CSharpDataTypeName == "decimal" ||
                    //    column.CSharpDataTypeName == "decimal?")
                    //{
                    //    if (CreateFileMemoryGetByField.IsNullValue(column, tableName))
                    //    {
                    //        //if (valueWorker.IMLimit.HasValue)
                    //        //valueWorker.IMLimit = Math.Round(valueWorker.IMLimit.Value, 6);
                    //        functionBuild.AppendLine("if (valueWorker." + columnName + ".HasValue)");
                    //        functionBuild.AppendLine("valueWorker." + columnName + " = Math.Round(valueWorker." + columnName + ".Value, " + column.NumericScale + ");");
                    //    }
                    //    else
                    //    {
                    //        //valueWorker.AvgBuyNet = Math.Round(valueWorker.AvgBuyNet, 6);
                    //        functionBuild.AppendLine("valueWorker." + columnName + " = Math.Round(valueWorker." + columnName + ", " + column.NumericScale + ");");
                    //    }
                    //}

                    if (column.CSharpDataTypeName == "DateTime" ||
                        column.CSharpDataTypeName == "DateTime?")
                    {
                        //Sử dụng hàm check time
                        //if (EntityCommandUtils.CheckTime(valueWorker.TimeChanged, valueDatabase.TimeChanged))
                        functionBuild.AppendLine("if (EntityCommandUtils.CheckTime(valueWorker." + columnName + ", valueDatabase." + columnName + "))");
                        functionBuild.AppendLine("{");
                        functionBuild.AppendLine("valueFail = string.Format(\"DatabaseValue ={0}. WorkerValue={1}\", valueDatabase." + columnName + ", valueWorker." + columnName + ");");
                        functionBuild.AppendLine("return \"" + columnName + "\";");
                        functionBuild.AppendLine("}");
                    }
                    else if (column.CSharpDataTypeName == "decimal" ||
                             column.CSharpDataTypeName == "decimal?")
                    {
                        //Sử dụng hàm check decimal
                        //if (EntityCommandUtils.CheckTime(valueWorker.TimeChanged, valueDatabase.TimeChanged))
                        functionBuild.AppendLine("if (EntityCommandUtils.CheckDecimal(valueWorker." + columnName + ", valueDatabase." + columnName + "))");
                        functionBuild.AppendLine("{");
                        functionBuild.AppendLine("valueFail = string.Format(\"DatabaseValue ={0}. WorkerValue={1}\", valueDatabase." + columnName + ", valueWorker." + columnName + ");");
                        functionBuild.AppendLine("return \"" + columnName + "\";");
                        functionBuild.AppendLine("}");
                    }
                    else
                    {
                        functionBuild.AppendLine("if (valueWorker." + columnName + " != valueDatabase." + columnName + ")");
                        functionBuild.AppendLine("{");
                        functionBuild.AppendLine("valueFail = string.Format(\"DatabaseValue ={0}. WorkerValue={1}\", valueDatabase." + columnName + ", valueWorker." + columnName + ");");
                        functionBuild.AppendLine("return \"" + columnName + "\";");
                        functionBuild.AppendLine("}");
                    }
                }

                functionBuild.AppendLine("return \"\";");
                functionBuild.AppendLine("}");
            }
            catch (Exception ex)
            {
            }
            return(functionBuild);
        }
Esempio n. 23
0
 /// <summary>重命名列
 /// 重命名列
 /// </summary>
 /// <param name="table"></param>
 /// <param name="databaseColumn"></param>
 /// <param name="originalColumn"></param>
 /// <returns></returns>
 public string RenameColumn(DatabaseTable table, DatabaseColumn databaseColumn, DatabaseColumn originalColumn)
 {
     return(m_migrationGenerator.RenameColumn(originalColumn.Table, databaseColumn, originalColumn.Name));
 }
        public override string AlterColumn(DatabaseTable databaseTable, DatabaseColumn databaseColumn, DatabaseColumn originalColumn)
        {
            var sb          = new StringBuilder();
            var defaultName = "DF_" + databaseTable.Name + "_" + databaseColumn.Name;

            if (originalColumn != null)
            {
                if (originalColumn.DefaultValue != null)
                {
                    //have to drop default contraint
                    var df = FindDefaultConstraint(databaseTable, databaseColumn.Name);
                    if (df != null)
                    {
                        defaultName = df.Name;
                        sb.AppendLine("ALTER TABLE " + TableName(databaseTable)
                                      + " DROP CONSTRAINT " + Escape(defaultName) + ";");
                    }
                }
            }
            //更新表中列的描述属性==>lhm
            if (originalColumn.Description != databaseColumn.Description)
            {
                sb.AppendLine("EXEC   sp_updateextendedproperty   'MS_Description','" + databaseColumn.Description + "','user',dbo,'table','" + databaseTable.Name + "','column','" + databaseColumn.Name + "'  " + ";");
            }
            //we could check if any of the properties are changed here
            sb.AppendLine(base.AlterColumn(databaseTable, databaseColumn, originalColumn));
            if (databaseColumn.DefaultValue != null)
            {
                //add default contraint
                sb.AppendLine("ALTER TABLE " + TableName(databaseTable) +
                              " ADD CONSTRAINT " + Escape(defaultName) +
                              " DEFAULT " + databaseColumn.DefaultValue +
                              " FOR " + Escape(databaseColumn.Name) + ";");
            }

            return(sb.ToString());
        }
Esempio n. 25
0
        private static void ConvertIndexes(DataTable dt, ICollection <DatabaseIndex> indexes)
        {
            if (dt == null)
            {
                return;
            }
            //Npgsql
            if (dt.Columns.Count == 0)
            {
                return;
            }

            var indexKeyMap = new IndexKeyMap(dt);

            foreach (DataRowView row in dt.DefaultView)
            {
                string name = row[indexKeyMap.Key].ToString();
                if (string.IsNullOrEmpty(name))
                {
                    continue;                             //all indexes should have a name
                }
                string schema    = !String.IsNullOrEmpty(indexKeyMap.SchemaKey) ? row[indexKeyMap.SchemaKey].ToString() : String.Empty;
                var    tableName = row[indexKeyMap.TableKey].ToString();
                var    c         = indexes.FirstOrDefault(f => f.Name == name && f.SchemaOwner == schema && f.TableName.Equals(tableName, StringComparison.OrdinalIgnoreCase));
                if (c == null)
                {
                    c             = new DatabaseIndex();
                    c.Name        = name;
                    c.SchemaOwner = schema;
                    c.TableName   = tableName;
                    if (indexKeyMap.Typekey != null)
                    {
                        c.IndexType = row[indexKeyMap.Typekey].ToString();
                    }
                    if (FindBoolean(row, indexKeyMap.UniqueKey, "UNIQUE"))
                    {
                        c.IsUnique  = true;
                        c.IndexType = "UNIQUE";
                    }
                    if (FindBoolean(row, indexKeyMap.PrimaryKey, String.Empty))
                    {
                        c.IndexType = "PRIMARY"; //primary keys should be unique too
                    }
                    indexes.Add(c);
                }
                if (string.IsNullOrEmpty(indexKeyMap.ColumnKey))
                {
                    continue;
                }

                string colName = row[indexKeyMap.ColumnKey].ToString();
                if (string.IsNullOrEmpty(colName))
                {
                    continue;
                }
                var column = new DatabaseColumn();
                column.Name = colName;
                if (!string.IsNullOrEmpty(indexKeyMap.OrdinalKey))
                {
                    int ordinal = Convert.ToInt32(row[indexKeyMap.OrdinalKey], CultureInfo.CurrentCulture);
                    column.Ordinal = ordinal;
                }
                if (ContainsColumn(c.Columns, colName))
                {
                    continue;
                }
                c.Columns.Add(column);
                if (c.Columns.Count > 1 && column.Ordinal != 0)
                {
                    //the order of the datatable may be wrong
                    c.Columns.Sort((x, y) => x.Ordinal.CompareTo(y.Ordinal));
                }
            }
        }
Esempio n. 26
0
 protected override string ColumnDataType(DatabaseColumn column)
 {
     return(_dataTypeWriter.WriteDataType(column));
 }
        protected virtual void GetColumns(
            DbConnection connection,
            IReadOnlyList <DatabaseTable> tables,
            Func <string, string, bool> tableFilter,
            string defaultCharSet,
            string defaultCollation)
        {
            foreach (var table in tables)
            {
                var columnTypeOverrides = GetColumnTypeOverrides(connection, table);

                using (var command = connection.CreateCommand())
                {
                    command.CommandText = string.Format(GetColumnsQuery, table.Name);
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var name         = reader.GetValueOrDefault <string>("COLUMN_NAME");
                            var defaultValue = reader.GetValueOrDefault <string>("COLUMN_DEFAULT");
                            var nullable     = reader.GetValueOrDefault <bool>("IS_NULLABLE");
                            var dataType     = reader.GetValueOrDefault <string>("DATA_TYPE");
                            var charset      = reader.GetValueOrDefault <string>("CHARACTER_SET_NAME");
                            var collation    = reader.GetValueOrDefault <string>("COLLATION_NAME");
                            var columnType   = reader.GetValueOrDefault <string>("COLUMN_TYPE");
                            var extra        = reader.GetValueOrDefault <string>("EXTRA");
                            var comment      = reader.GetValueOrDefault <string>("COLUMN_COMMENT");

                            // Generated colums are not supported on every MySQL/MariaDB version.
                            var generation = reader.HasName("GENERATION_EXPRESSION")
                                ? reader.GetValueOrDefault <string>("GENERATION_EXPRESSION").NullIfEmpty()
                                : null;

                            // MariaDB does not support SRID column restrictions.
                            var srid = reader.HasName("SRS_ID")
                                ? reader.GetValueOrDefault <uint?>("SRS_ID")
                                : null;

                            var isStored = generation != null
                                ? (bool?)extra.Contains("stored generated", StringComparison.OrdinalIgnoreCase)
                                : null;

                            // Override this column's type, if we detected earlier that this column should actually by added to the model
                            // with a different type than the one returned by INFORMATION_SCHEMA.COLUMNS.
                            // This ensures, that e.g. the `json` alias for the `longtext` type for MariaDB databases will be added to the
                            // model as `json` instead of as `longtext`.
                            columnType = columnTypeOverrides.TryGetValue(name, out var columnTypeOverride)
                                ? columnTypeOverride((dataType: dataType, charset: charset, collation: collation))
                                : columnType;

                            // MySQL enforces the `utf8mb4` charset and `utf8mb4_bin` collation for `json` columns and MariaDB will use them
                            // automatically for `json` columns as well.
                            // Both will refuse explicit specifications of other charsets/collations, even though `json` is just an alias
                            // for `longtext` for MariaDB and setting `longtext` to other charsets/collations works fine.
                            // We therefore do not scaffold thouse charsets/collations in the first place, so that users don't get confused.
                            if (columnType == "json")
                            {
                                charset   = null;
                                collation = null;
                            }

                            // MySQL saves the generation expression with enclosing parenthesis, while MariaDB doesn't.
                            generation = generation != null &&
                                         _options.ServerVersion.Supports.ParenthesisEnclosedGeneratedColumnExpressions
                                ? Regex.Replace(generation, @"^\((.*)\)$", "$1", RegexOptions.Singleline)
                                : generation;

                            var isDefaultValueSqlFunction = IsDefaultValueSqlFunction(defaultValue, dataType);
                            var isDefaultValueExpression  = false;

                            if (defaultValue != null)
                            {
                                // MySQL 8.0.13+ fully supports complex default value expressions.
                                isDefaultValueExpression = extra.Contains("DEFAULT_GENERATED", StringComparison.OrdinalIgnoreCase) &&
                                                           !IsSimpleNumericDefaultValue(defaultValue);

                                // MariaDB uses a slightly different syntax.
                                defaultValue = _options.ServerVersion.Supports.AlternativeDefaultExpression
                                    ? ConvertDefaultValueFromMariaDbToMySql(defaultValue, out isDefaultValueExpression)
                                    : defaultValue;

                                defaultValue = generation == null
                                    ? FilterClrDefaults(
                                    dataType,
                                    nullable,
                                    defaultValue)
                                    : null;
                            }

                            ValueGenerated?valueGenerated;
                            if (extra.IndexOf("auto_increment", StringComparison.Ordinal) >= 0)
                            {
                                valueGenerated = ValueGenerated.OnAdd;
                            }
                            else if (extra.IndexOf("on update", StringComparison.Ordinal) >= 0)
                            {
                                if (defaultValue != null && extra.IndexOf(defaultValue, StringComparison.Ordinal) > 0 ||
                                    (string.Equals(dataType, "timestamp", StringComparison.OrdinalIgnoreCase) ||
                                     string.Equals(dataType, "datetime", StringComparison.OrdinalIgnoreCase)) &&
                                    extra.IndexOf("CURRENT_TIMESTAMP", StringComparison.OrdinalIgnoreCase) > 0)
                                {
                                    valueGenerated = ValueGenerated.OnAddOrUpdate;
                                }
                                else
                                {
                                    valueGenerated = ValueGenerated.OnUpdate;
                                }
                            }
                            else
                            {
                                // Using `null` results in `ValueGeneratedNever()` being output for primary keys without
                                // auto increment as desired, while explicitly using `ValueGenerated.Never` results in
                                // no value generated output at all.
                                valueGenerated = null;
                            }

                            var column = new DatabaseColumn
                            {
                                Table             = table,
                                Name              = name,
                                StoreType         = columnType,
                                IsNullable        = nullable,
                                DefaultValueSql   = CreateDefaultValueString(defaultValue, dataType, isDefaultValueSqlFunction, isDefaultValueExpression),
                                ComputedColumnSql = generation,
                                IsStored          = isStored,
                                ValueGenerated    = valueGenerated,
                                Comment           = string.IsNullOrEmpty(comment)
                                    ? null
                                    : comment,
                                [MySqlAnnotationNames.CharSet] = Settings.CharSet &&
                                                                 charset != (table[MySqlAnnotationNames.CharSet] as string ?? defaultCharSet)
                                    ? charset
                                    : null,
                                Collation = Settings.Collation &&
                                            collation != (table[RelationalAnnotationNames.Collation] as string ?? defaultCollation)
                                    ? collation
                                    : null,
                                [MySqlAnnotationNames.SpatialReferenceSystemId] = srid.HasValue
                                    ? (int?)(int)srid.Value
                                    : null,
                            };

                            table.Columns.Add(column);
                        }
                    }
                }
            }
        }
Esempio n. 28
0
 public static IQuery Where <T>(DatabaseColumn column, T equalsValue)
 {
     return(new DeleteQueryBuilder <T>(column, equalsValue).Build( ));
 }
Esempio n. 29
0
        public static IKeywordGenerator getGenerator(string keyword, baseContext ctx, DatabaseColumn databaseColumn)
        {
            Regex r = new Regex(@"integer ?[0-9]*,?[0-9]*,?[0-9]*( u)?");

            if (r.IsMatch(keyword))
            {
                return(new IntegerGenerator(keyword));
            }

            keyword = keyword.ToLower();
            keyword = keyword.Trim();


            string[] keywords;
            bool[]   uniques;
            // Look for combined keywords
            if (keyword.Contains('|'))
            {
                keywords = keyword.Split('|');
            }
            else
            {
                keywords    = new string[1];
                keywords[0] = keyword;
            }
            uniques = new bool[keywords.Length];
            List <List <string> > listsOfValues = new List <List <string> >(keywords.Length);

            for (int i = 0; i < keywords.Length; i++)
            {
                string        currentKeyword = keywords[i];
                List <string> values;
                bool          isUnique = currentKeyword.EndsWith(" u");
                if (isUnique)
                {
                    currentKeyword = currentKeyword[0..^ 2];
        private void GetColumns(
            DbConnection connection,
            string tableFilter,
            DatabaseModel databaseModel)
        {
            using (var command = (OracleCommand)connection.CreateCommand())
            {
                command.InitialLONGFetchSize = -1;

                command.CommandText = new StringBuilder()
                                      .AppendLine("SELECT")
                                      .AppendLine("   t.tablespace_name,")
                                      .AppendLine("   c.table_name,")
                                      .AppendLine("   c.column_name,")
                                      .AppendLine("   c.column_id,")
                                      .AppendLine("   c.data_type,")
                                      .AppendLine("   c.data_length,")
                                      .AppendLine("   c.data_precision,")
                                      .AppendLine("   c.data_scale,")
                                      .AppendLine("   c.nullable,")
                                      .AppendLine("   c.identity_column,")
                                      .AppendLine("   c.data_default,")
                                      .AppendLine("   c.virtual_column")
                                      .AppendLine("FROM user_tab_cols c")
                                      .AppendLine("INNER JOIN user_tables t ")
                                      .AppendLine("ON UPPER(t.table_name)=UPPER(c.table_name)")
                                      .AppendLine(tableFilter)
                                      .AppendLine("ORDER BY c.column_id")
                                      .ToString();

                using (var reader = command.ExecuteReader())
                {
                    var tableColumnGroups = reader.Cast <DbDataRecord>()
                                            .GroupBy(
                        ddr => (tableSchema: ddr.GetValueOrDefault <string>("tablespace_name"),
                                tableName: ddr.GetValueOrDefault <string>("table_name")));

                    foreach (var tableColumnGroup in tableColumnGroups)
                    {
                        var tableSchema = tableColumnGroup.Key.tableSchema;
                        var tableName   = tableColumnGroup.Key.tableName;
                        var table       = databaseModel.Tables.Single(t => t.Schema == tableSchema && t.Name == tableName);

                        foreach (var dataRecord in tableColumnGroup)
                        {
                            var columnName   = dataRecord.GetValueOrDefault <string>("column_name");
                            var ordinal      = dataRecord.GetValueOrDefault <int>("column_id");
                            var dataTypeName = dataRecord.GetValueOrDefault <string>("data_type");
                            var maxLength    = dataRecord.GetValueOrDefault <int>("data_length");
                            var precision    = dataRecord.GetValueOrDefault <int>("data_precision");
                            var scale        = dataRecord.GetValueOrDefault <int>("data_scale");
                            var isNullable   = dataRecord.GetValueOrDefault <string>("nullable").Equals("Y");
                            var isIdentity   = dataRecord.GetValueOrDefault <string>("identity_column").Equals("YES");
                            var defaultValue = !isIdentity?dataRecord.GetValueOrDefault <string>("data_default") : null;

                            var computedValue = dataRecord.GetValueOrDefault <string>("virtual_column").Equals("YES") ? defaultValue : null;

                            var storeType = GetOracleClrType(dataTypeName, maxLength, precision, scale);
                            if (string.IsNullOrWhiteSpace(defaultValue) ||
                                !string.IsNullOrWhiteSpace(computedValue))
                            {
                                defaultValue = null;
                            }

                            _logger.ColumnFound(
                                DisplayName(tableSchema, tableName),
                                columnName,
                                ordinal,
                                dataTypeName,
                                maxLength,
                                precision,
                                scale,
                                isNullable,
                                isIdentity,
                                defaultValue,
                                computedValue);

                            var column = new DatabaseColumn
                            {
                                Table             = table,
                                Name              = columnName,
                                StoreType         = storeType,
                                IsNullable        = isNullable,
                                DefaultValueSql   = defaultValue,
                                ComputedColumnSql = computedValue,
                                ValueGenerated    = isIdentity
                                    ? ValueGenerated.OnAdd
                                    : default(ValueGenerated?)
                            };

                            table.Columns.Add(column);
                        }
                    }
                }
            }
        }
Esempio n. 31
0
 public DatabaseColumn Column(string columnName)
 {
     DatabaseColumn columnConfig = new DatabaseColumn(columnName);
     Columns.Add(columnConfig);
     return columnConfig;
 }