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()); }
/// <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)); }
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 "); }