Skip to content

Commit bd4801a

Browse files
author
fabien.menager
committed
Rename escape -> quote and add a custom table name
1 parent 829a496 commit bd4801a

8 files changed

Lines changed: 33 additions & 30 deletions

File tree

src/EntityFrameworkCore.ExecuteInsert.PostgreSql/PostgreSqlBulkInsertProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class PostgreSqlBulkInsertProvider : BulkInsertProviderBase<PostgreSqlDia
1919

2020
private string GetBinaryImportCommand(DbContext context, Type entityType, string tableName)
2121
{
22-
var columns = GetEscapedColumns(context, entityType, false);
22+
var columns = GetQuotedColumns(context, entityType, false);
2323

2424
return $"COPY {tableName} ({string.Join(", ", columns)}) FROM STDIN (FORMAT BINARY)";
2525
}

src/EntityFrameworkCore.ExecuteInsert.SqlServer/SqlServerBulkInsertProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ protected override async Task BulkInsert<T>(DbContext context, IEnumerable<T> en
3333

3434
foreach (var prop in properties)
3535
{
36-
bulkCopy.ColumnMappings.Add(prop.Name, SqlDialect.Escape(prop.ColumnName));
36+
bulkCopy.ColumnMappings.Add(prop.Name, SqlDialect.Quote(prop.ColumnName));
3737
}
3838

3939
await bulkCopy.WriteToServerAsync(new EnumerableDataReader<T>(entities, properties), ctk);

src/EntityFrameworkCore.ExecuteInsert.SqlServer/SqlServerDialectBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public override string BuildMoveDataSql<T>(DbContext context, string source,
2323
IProperty[] properties,
2424
BulkInsertOptions options, OnConflictOptions? onConflict = null)
2525
{
26-
var insertedColumns = insertedProperties.Select(p => Escape(p.GetColumnName())).ToArray();
26+
var insertedColumns = insertedProperties.Select(p => Quote(p.GetColumnName())).ToArray();
2727
var insertedColumnList = string.Join(", ", insertedColumns);
2828

2929
var returnedColumns = properties.Select(p => $"INSERTED.{p.GetColumnName()} AS {p.GetColumnName()}");

src/EntityFrameworkCore.ExecuteInsert.Sqlite/SqliteBulkInsertProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ private DbCommand GetInsertCommand(DbContext context, Type entityType, string ta
102102
return $"({string.Join(",", cols)})";
103103
});
104104

105-
var sql = $"INSERT INTO {tableName} ({string.Join(",", sqliteColumns.Select(c => Escape(c.Name)))}) VALUES {string.Join(",", batches)}";
105+
var sql = $"INSERT INTO {tableName} ({string.Join(",", sqliteColumns.Select(c => Quote(c.Name)))}) VALUES {string.Join(",", batches)}";
106106

107107
cmd.CommandText = sql;
108108

src/EntityFrameworkCore.ExecuteInsert/BulkInsertProviderBase.cs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ protected async Task<string> CreateTableCopyAsync<T>(
2626
CancellationToken cancellationToken = default) where T : class
2727
{
2828
var tableInfo = GetTableInfo(context, typeof(T));
29-
var tableName = EscapeTableName(tableInfo.SchemaName, tableInfo.TableName);
30-
var tempTableName = EscapeTableName(null, GetTempTableName(tableInfo.TableName));
29+
var tableName = QuoteTableName(tableInfo.SchemaName, tableInfo.TableName);
30+
var tempTableName = QuoteTableName(null, GetTempTableName(tableInfo.TableName));
3131

32-
var keptColumns = string.Join(", ", GetEscapedColumns(context, typeof(T), false));
32+
var keptColumns = string.Join(", ", GetQuotedColumns(context, typeof(T), false));
3333
var query = string.Format(CreateTableCopySql, tempTableName, tableName, keptColumns);
3434
await ExecuteAsync(connection, query, cancellationToken);
3535

@@ -47,7 +47,7 @@ protected virtual async Task AddBulkInsertIdColumn<T>(DbConnection connection, C
4747

4848
protected virtual string GetTempTableName(string tableName) => $"_temp_bulk_insert_{tableName}";
4949

50-
protected string Escape(string name) => SqlDialect.Escape(name);
50+
protected string Quote(string name) => SqlDialect.Quote(name);
5151

5252
protected static async Task ExecuteAsync(DbConnection connection, string query, CancellationToken cancellationToken = default)
5353
{
@@ -86,12 +86,12 @@ private async Task<List<TResult>> CopyFromTempTableWithoutKeysAsync<T, TResult>(
8686
where TResult : class
8787
{
8888
var (schemaName, tableName, _) = GetTableInfo(context, typeof(T));
89-
var escapedTableName = EscapeTableName(schemaName, tableName);
89+
var quotedTableName = QuoteTableName(schemaName, tableName);
9090

9191
var movedProperties = context.GetProperties(typeof(T), false);
9292
var returnedProperties = returnData ? context.GetProperties(typeof(T)) : [];
9393

94-
var query = SqlDialect.BuildMoveDataSql<T>(context, tempTableName, escapedTableName, movedProperties, returnedProperties, options, onConflict);
94+
var query = SqlDialect.BuildMoveDataSql<T>(context, tempTableName, quotedTableName, movedProperties, returnedProperties, options, onConflict);
9595

9696
if (returnData)
9797
{
@@ -171,9 +171,8 @@ public async Task BulkInsertWithoutReturnAsync<T>(
171171

172172
var tableName = tempTableRequired
173173
? await CreateTableCopyAsync<T>(context, connection, ctk)
174-
: GetEscapedTableName(context, typeof(T));
174+
: GetQuotedTableName(context, typeof(T));
175175

176-
// Utilisation du wrapper PropertyAccessor
177176
var properties = context
178177
.GetProperties(typeof(T), false)
179178
.Select(p => new PropertyAccessor(p))
@@ -193,7 +192,7 @@ protected abstract Task BulkInsert<T>(DbContext context, IEnumerable<T> entities
193192
string tableName, PropertyAccessor[] properties, BulkInsertOptions options, CancellationToken ctk) where T : class;
194193

195194
/// <summary>
196-
/// Escapes a schema and table name using database-specific delimiters.
195+
/// Get table information for the given entity type : schema name, table name and primary key.
197196
/// </summary>
198197
public static (string? SchemaName, string TableName, IKey PrimaryKey) GetTableInfo(DbContext context, Type entityType)
199198
{
@@ -209,19 +208,19 @@ public static (string? SchemaName, string TableName, IKey PrimaryKey) GetTableIn
209208
return (schema, tableName, entityTypeInfo.FindPrimaryKey()!);
210209
}
211210

212-
protected string GetEscapedTableName(DbContext context, Type entityType)
211+
protected string GetQuotedTableName(DbContext context, Type entityType)
213212
{
214213
var (schema, tableName, _) = GetTableInfo(context, entityType);
215214

216-
return EscapeTableName(schema, tableName);
215+
return QuoteTableName(schema, tableName);
217216
}
218217

219-
protected string EscapeTableName(string? schema, string table) => SqlDialect.EscapeTableName(schema, table);
218+
protected string QuoteTableName(string? schema, string table) => SqlDialect.QuoteTableName(schema, table);
220219

221-
protected string[] GetEscapedColumns(DbContext context, Type entityType, bool includeGenerated = true)
220+
protected string[] GetQuotedColumns(DbContext context, Type entityType, bool includeGenerated = true)
222221
{
223222
return context.GetProperties(entityType, includeGenerated)
224-
.Select(p => Escape(p.GetColumnName()))
223+
.Select(p => Quote(p.GetColumnName()))
225224
.ToArray();
226225
}
227226
}

src/EntityFrameworkCore.ExecuteInsert/Dialect/SqlDialectBuilder.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ protected string GetColumnName<TEntity>(DbContext context, string propName)
3838
throw new InvalidOperationException($"Property {propName} not found in entity type {typeof(TEntity).Name}.");
3939
}
4040

41-
return Escape(property.GetColumnName());
41+
return Quote(property.GetColumnName());
4242
}
4343

4444
/// <summary>
@@ -59,10 +59,10 @@ public virtual string BuildMoveDataSql<T>(DbContext context, string source,
5959
IProperty[] properties,
6060
BulkInsertOptions options, OnConflictOptions? onConflict = null)
6161
{
62-
var insertedColumns = insertedProperties.Select(p => Escape(p.GetColumnName()));
62+
var insertedColumns = insertedProperties.Select(p => Quote(p.GetColumnName()));
6363
var insertedColumnList = string.Join(", ", insertedColumns);
6464

65-
var returnedColumns = properties.Select(p => Escape(p.GetColumnName()));
65+
var returnedColumns = properties.Select(p => Quote(p.GetColumnName()));
6666
var columnList = string.Join(", ", returnedColumns);
6767

6868
var q = new StringBuilder();
@@ -131,18 +131,18 @@ protected virtual string GetExcludedColumnName<TEntity>(DbContext context, Membe
131131
}
132132

133133
/// <summary>
134-
/// Escapes a column name using database-specific delimiters.
134+
/// Quotes a column name using database-specific delimiters.
135135
/// </summary>
136-
public string Escape(string entity) => $"{OpenDelimiter}{entity}{CloseDelimiter}";
136+
public string Quote(string entity) => $"{OpenDelimiter}{entity}{CloseDelimiter}";
137137

138138
/// <summary>
139-
/// Escapes a schema and table name using database-specific delimiters.
139+
/// Quotes a schema and table name using database-specific delimiters.
140140
/// </summary>
141-
public string EscapeTableName(string? schema, string tableName)
141+
public string QuoteTableName(string? schema, string tableName)
142142
{
143143
return schema != null
144-
? $"{Escape(schema)}.{Escape(tableName)}"
145-
: Escape(tableName);
144+
? $"{Quote(schema)}.{Quote(tableName)}"
145+
: Quote(tableName);
146146
}
147147

148148
/// <summary>
@@ -293,7 +293,7 @@ private string ToSqlExpression<TEntity>(DbContext context, Expression expr)
293293
}
294294

295295
case ParameterExpression p:
296-
return Escape(p.Name ?? "param");
296+
return Quote(p.Name ?? "param");
297297

298298
default:
299299
throw new NotSupportedException($"Expression not supported: {expr.NodeType}");

tests/EntityFrameworkCore.ExecuteInsert.Tests/DbContext/TestEntity.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,17 @@ namespace EntityFrameworkCore.ExecuteInsert.Tests.DbContext;
88

99
[PrimaryKey(nameof(Id))]
1010
[Index(nameof(Name), IsUnique = true)]
11+
[Table("test_entity")]
1112
public class TestEntity
1213
{
14+
1315
public int Id { get; set; }
1416

1517
[Column("name")]
1618
[MaxLength(100)]
1719
public string Name { get; set; } = string.Empty;
20+
21+
[Column("some_price")]
1822
public decimal Price { get; set; }
1923

2024
[Column("the_identifier")]

tests/EntityFrameworkCore.ExecuteInsert.Tests/Tests/Basic/BasicTestsBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ await DbContainer.DbContext.ExecuteInsertAsync(entities, o =>
132132
[SkippableFact]
133133
public async Task InsertsEntitiesWithConflict_Condition()
134134
{
135-
Skip.If(DbContainer.DbContext.Database.ProviderName!.Contains("Npgsql", StringComparison.InvariantCultureIgnoreCase));
135+
// Skip.If(DbContainer.DbContext.Database.ProviderName!.Contains("Npgsql", StringComparison.InvariantCultureIgnoreCase));
136136

137137
DbContainer.DbContext.TestEntities.Add(new TestEntity { Name = "Entity1", Price = 10 });
138138
await DbContainer.DbContext.SaveChangesAsync();
@@ -151,7 +151,7 @@ await DbContainer.DbContext.ExecuteInsertAsync(entities, o =>
151151
{
152152
Match = e => new { e.Name },
153153
Update = e => new TestEntity { Price = e.Price },
154-
Condition = "EXCLUDED.Price > TestEntities.Price"
154+
Condition = "EXCLUDED.some_price > test_entity.some_price"
155155
});
156156

157157
var insertedEntities = DbContainer.DbContext.TestEntities.ToList();

0 commit comments

Comments
 (0)