예제 #1
0
        /// <inheritdoc />
        public async Task <int> CreateTableAsync(Type mappedType)
        {
            var table          = Schema.Table(mappedType);
            var columns        = Schema.Columns(mappedType).Where(c => !c.IsKeyColumn);
            var primaryKeyCols = Schema.Columns(mappedType).Where(c => c.IsKeyColumn);

            var columnDefs = new List <string>(64);

            foreach (var c in primaryKeyCols)
            {
                var sqlType = DbTypes.Map(c.NativeType).ToString().ToUpperInvariant();
                if (c.NativeType == typeof(string))
                {
                    sqlType = $"{sqlType} ({c.StringLength})";
                }

                columnDefs.Add($"{c.QualifiedName} {sqlType} {(c.IsKeyGenerated ? "IDENTITY(1,1)" : "NOT NULL")}");
            }

            foreach (var c in columns)
            {
                var sqlType = DbTypes.Map(c.NativeType).ToString().ToUpperInvariant();
                if (c.NativeType == typeof(string))
                {
                    sqlType = $"{sqlType} ({c.StringLength})";
                }

                columnDefs.Add($"{c.QualifiedName} {sqlType} {(c.IsNullable ? "NULL" : "NOT NULL")}");
            }

            var createTable = $"CREATE TABLE {table.QualifiedName} ({string.Join(", ", columnDefs)}, " +
                              $"CONSTRAINT PK_{table.Name.Replace(" ", "_")} " +
                              $"PRIMARY KEY ({string.Join(", ", primaryKeyCols.Select(c => c.QualifiedName))}))";

            var command = Connection.CreateCommand();

            command.CommandTimeout = _parent.SqlCommandTimeoutSeconds;
            command.CommandText    = createTable;

            return(await command.ExecuteNonQueryAsync().ConfigureAwait(false));
        }