示例#1
0
        private string GetColumnsDefinitions(IEntityType entityType, ISqlServerTempTableCreationOptions options)
        {
            if (entityType == null)
            {
                throw new ArgumentNullException(nameof(entityType));
            }

            var properties = options.MembersToInclude.GetPropertiesForTempTable(entityType);
            var sb         = new StringBuilder();
            var isFirst    = true;

            foreach (var property in properties)
            {
                if (!isFirst)
                {
                    sb.AppendLine(",");
                }

                var columnType = property.GetColumnType();

                sb.Append("\t\t")
                .Append(_sqlGenerationHelper.DelimitIdentifier(property.GetColumnBaseName())).Append(' ')
                .Append(columnType);

                if (options.UseDefaultDatabaseCollation && _stringColumnTypes.Any(t => columnType.StartsWith(t, StringComparison.OrdinalIgnoreCase)))
                {
                    sb.Append(" COLLATE database_default");
                }

                sb.Append(property.IsNullable ? " NULL" : " NOT NULL");

                if (IsIdentityColumn(property))
                {
                    sb.Append(" IDENTITY");
                }

                var defaultValueSql = property.GetDefaultValueSql();

                if (!String.IsNullOrWhiteSpace(defaultValueSql))
                {
                    sb.Append(" DEFAULT (").Append(defaultValueSql).Append(')');
                }
                else
                {
                    var defaultValue = property.GetDefaultValue();

                    if (defaultValue != null && defaultValue != DBNull.Value)
                    {
                        var mappingForValue = _typeMappingSource.GetMappingForValue(defaultValue);
                        sb.Append(" DEFAULT ").Append(mappingForValue.GenerateSqlLiteral(defaultValue));
                    }
                }

                isFirst = false;
            }

            CreatePkClause(options.PrimaryKeyCreation.GetPrimaryKeyProperties(entityType, properties), sb);

            return(sb.ToString());
        }
示例#2
0
        /// <inheritdoc />
        public async Task <ITempTableReference> CreateTempTableAsync(
            IEntityType entityType,
            ISqlServerTempTableCreationOptions options,
            CancellationToken cancellationToken = default)
        {
            if (entityType == null)
            {
                throw new ArgumentNullException(nameof(entityType));
            }
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            var(nameLease, tableName) = GetTableName(entityType, options.TableNameProvider);
            var sql = GetTempTableCreationSql(entityType, tableName, options);

            await _ctx.Database.OpenConnectionAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                await _ctx.Database.ExecuteSqlRawAsync(sql, cancellationToken).ConfigureAwait(false);
            }
            catch (Exception)
            {
                await _ctx.Database.CloseConnectionAsync().ConfigureAwait(false);

                throw;
            }

            return(new SqlServerTempTableReference(_logger, _sqlGenerationHelper, tableName, _ctx.Database, nameLease, options.DropTableOnDispose));
        }
示例#3
0
        private string GetTempTableCreationSql(IEntityType entityType, string tableName, ISqlServerTempTableCreationOptions options)
        {
            if (tableName == null)
            {
                throw new ArgumentNullException(nameof(tableName));
            }

            var sql = $@"
      CREATE TABLE {_sqlGenerationHelper.DelimitIdentifier(tableName)}
      (
{GetColumnsDefinitions(entityType, options)}
      );";

            if (!options.TruncateTableIfExists)
            {
                return(sql);
            }

            return($@"
IF(OBJECT_ID('tempdb..{tableName}') IS NOT NULL)
   TRUNCATE TABLE {_sqlGenerationHelper.DelimitIdentifier(tableName)};
ELSE
BEGIN
{sql}
END
");
        }