From 535d57049be6ededad65876d6a9206d2f708ad45 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Fri, 23 May 2025 08:31:33 +0200 Subject: [PATCH] Rename to columns --- .../MySqlBulkInsertProvider.cs | 2 +- .../MySqlDialectBuilder.cs | 6 ++-- .../PostgreSqlBulkInsertProvider.cs | 15 ++++----- .../PostgreSqlDialectBuilder.cs | 2 +- .../SqlServerBulkInsertProvider.cs | 10 +++--- .../SqlServerDialectBuilder.cs | 30 ++++++++--------- .../SqliteBulkInsertProvider.cs | 18 +++++------ .../SqliteDialectBuilder.cs | 2 +- .../BulkInsertProviderBase.cs | 12 +++---- .../Dialect/SqlDialectBuilder.cs | 32 +++++++++---------- .../EnumerableDataReader.cs | 20 ++++++------ .../Helpers.cs | 2 +- ...{PropertyMetadata.cs => ColumnMetadata.cs} | 6 ++-- .../Metadata/TableMetadata.cs | 24 +++++++------- 14 files changed, 90 insertions(+), 91 deletions(-) rename src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/{PropertyMetadata.cs => ColumnMetadata.cs} (90%) diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlBulkInsertProvider.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlBulkInsertProvider.cs index b737cb6..ab08f92 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlBulkInsertProvider.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlBulkInsertProvider.cs @@ -42,7 +42,7 @@ protected override async Task BulkInsert( TableMetadata tableInfo, IEnumerable entities, string tableName, - IReadOnlyList properties, + IReadOnlyList properties, BulkInsertOptions options, CancellationToken ctk ) diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlDialectBuilder.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlDialectBuilder.cs index f25ee09..62ed057 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlDialectBuilder.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlDialectBuilder.cs @@ -14,7 +14,7 @@ internal class MySqlServerDialectBuilder : SqlDialectBuilder protected override bool SupportsMoveRows => false; - public override string CreateTableCopySql(string tempNameName, TableMetadata tableInfo, IReadOnlyList columns) + public override string CreateTableCopySql(string tempNameName, TableMetadata tableInfo, IReadOnlyList columns) { return $"CREATE TEMPORARY TABLE {tempNameName} SELECT * FROM {tableInfo.QuotedTableName} WHERE 1 = 0;"; } @@ -46,9 +46,9 @@ protected override void AppendOnConflictStatement(StringBuilder sql) sql.Append("ON DUPLICATE KEY"); } - protected override void AppendDoNothing(StringBuilder sql, IEnumerable insertedProperties) + protected override void AppendDoNothing(StringBuilder sql, IEnumerable insertedColumns) { - var columnName = insertedProperties.First().ColumnName; + var columnName = insertedColumns.First().ColumnName; sql.Append($"UPDATE {Quote(columnName)} = {GetExcludedColumnName(columnName)}"); } diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlBulkInsertProvider.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlBulkInsertProvider.cs index bd07d14..1258845 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlBulkInsertProvider.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlBulkInsertProvider.cs @@ -23,7 +23,7 @@ public PostgreSqlBulkInsertProvider(ILogger? logge /// protected override string AddTableCopyBulkInsertId => $"ALTER TABLE {{0}} ADD COLUMN {BulkInsertId} SERIAL PRIMARY KEY;"; - private static string GetBinaryImportCommand(IReadOnlyList properties, string tableName) + private static string GetBinaryImportCommand(IReadOnlyList properties, string tableName) { var sql = new StringBuilder(); sql.Append($"COPY {tableName} ("); @@ -39,18 +39,17 @@ protected override async Task BulkInsert( TableMetadata tableInfo, IEnumerable entities, string tableName, - IReadOnlyList properties, + IReadOnlyList columns, BulkInsertOptions options, CancellationToken ctk) { var connection = (NpgsqlConnection)context.Database.GetDbConnection(); - - var importCommand = GetBinaryImportCommand(properties, tableName); + var command = GetBinaryImportCommand(columns, tableName); var writer = sync // ReSharper disable once MethodHasAsyncOverloadWithCancellation - ? connection.BeginBinaryImport(importCommand) - : await connection.BeginBinaryImportAsync(importCommand, ctk); + ? connection.BeginBinaryImport(command) + : await connection.BeginBinaryImportAsync(command, ctk); foreach (var entity in entities) { @@ -64,9 +63,9 @@ protected override async Task BulkInsert( await writer.StartRowAsync(ctk); } - foreach (var property in properties) + foreach (var column in columns) { - var value = property.GetValue(entity); + var value = column.GetValue(entity); if (sync) { diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlDialectBuilder.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlDialectBuilder.cs index e4d69c0..483093f 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlDialectBuilder.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlDialectBuilder.cs @@ -11,7 +11,7 @@ internal class PostgreSqlDialectBuilder : SqlDialectBuilder protected override string OpenDelimiter => "\""; protected override string CloseDelimiter => "\""; - public override string CreateTableCopySql(string tempNameName, TableMetadata tableInfo, IReadOnlyList columns) + public override string CreateTableCopySql(string tempNameName, TableMetadata tableInfo, IReadOnlyList columns) { return $"CREATE TEMPORARY TABLE {tempNameName} AS TABLE {tableInfo.QuotedTableName} WITH NO DATA;"; } diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerBulkInsertProvider.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerBulkInsertProvider.cs index 8d93176..79fc58f 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerBulkInsertProvider.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerBulkInsertProvider.cs @@ -31,7 +31,7 @@ protected override async Task BulkInsert( TableMetadata tableInfo, IEnumerable entities, string tableName, - IReadOnlyList properties, + IReadOnlyList columns, BulkInsertOptions options, CancellationToken ctk) { @@ -43,19 +43,19 @@ protected override async Task BulkInsert( bulkCopy.BatchSize = options.BatchSize ?? 50_000; bulkCopy.BulkCopyTimeout = options.GetCopyTimeoutInSeconds(); - foreach (var prop in properties) + foreach (var column in columns) { - bulkCopy.ColumnMappings.Add(prop.Name, prop.ColumnName); + bulkCopy.ColumnMappings.Add(column.PropertyName, column.ColumnName); } if (sync) { // ReSharper disable once MethodHasAsyncOverloadWithCancellation - bulkCopy.WriteToServer(new EnumerableDataReader(entities, properties)); + bulkCopy.WriteToServer(new EnumerableDataReader(entities, columns)); } else { - await bulkCopy.WriteToServerAsync(new EnumerableDataReader(entities, properties), ctk); + await bulkCopy.WriteToServerAsync(new EnumerableDataReader(entities, columns), ctk); } } } diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerDialectBuilder.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerDialectBuilder.cs index ef5c4be..7e5885a 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerDialectBuilder.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerDialectBuilder.cs @@ -14,7 +14,7 @@ internal class SqlServerDialectBuilder : SqlDialectBuilder protected override bool SupportsMoveRows => false; - public override string CreateTableCopySql(string tempTableName, TableMetadata tableInfo, IReadOnlyList columns) + public override string CreateTableCopySql(string tempTableName, TableMetadata tableInfo, IReadOnlyList columns) { var q = new StringBuilder(); q.Append($"CREATE TABLE {tempTableName} ("); @@ -37,8 +37,8 @@ public override string CreateTableCopySql(string tempTableName, TableMetadata ta public override string BuildMoveDataSql( TableMetadata target, string source, - IReadOnlyList insertedProperties, - IReadOnlyList returnedProperties, + IReadOnlyList insertedColumns, + IReadOnlyList returnedColumns, BulkInsertOptions options, OnConflictOptions? onConflict = null) { @@ -69,9 +69,9 @@ public override string BuildMoveDataSql( q.AppendLine($"MERGE INTO {target.QuotedTableName} AS TARGET"); q.Append("USING (SELECT "); - q.AppendColumns(insertedProperties); + q.AppendColumns(insertedColumns); q.Append($" FROM {source}) AS SOURCE ("); - q.AppendColumns(insertedProperties); + q.AppendColumns(insertedColumns); q.AppendLine(")"); q.Append("ON "); @@ -80,25 +80,25 @@ public override string BuildMoveDataSql( if (onConflictTyped.Update != null) { - var properties = target.GetProperties(false); + var columns = target.GetColumns(false); q.AppendLine($"WHEN MATCHED THEN UPDATE SET "); - q.AppendJoin(", ", GetUpdates(target, properties, onConflictTyped.Update)); + q.AppendJoin(", ", GetUpdates(target, columns, onConflictTyped.Update)); q.AppendLine(); } q.Append($"WHEN NOT MATCHED THEN INSERT ("); - q.AppendColumns(insertedProperties); + q.AppendColumns(insertedColumns); q.AppendLine(")"); q.Append("VALUES ("); - q.AppendJoin(", ", insertedProperties, (b, col) => b.Append($"SOURCE.{col.QuotedColumName}")); + q.AppendJoin(", ", insertedColumns, (b, col) => b.Append($"SOURCE.{col.QuotedColumName}")); q.AppendLine(")"); - if (returnedProperties.Count != 0) + if (returnedColumns.Count != 0) { q.Append("OUTPUT "); - q.AppendJoin($", ", returnedProperties, (b, col) => b.Append($"INSERTED.{col.QuotedColumName} AS {col.QuotedColumName}")); + q.AppendJoin($", ", returnedColumns, (b, col) => b.Append($"INSERTED.{col.QuotedColumName} AS {col.QuotedColumName}")); q.AppendLine(); } } @@ -107,18 +107,18 @@ public override string BuildMoveDataSql( else { q.Append($"INSERT INTO {target.QuotedTableName} ("); - q.AppendColumns(insertedProperties); + q.AppendColumns(insertedColumns); q.AppendLine(")"); - if (returnedProperties.Count != 0) + if (returnedColumns.Count != 0) { q.Append("OUTPUT "); - q.AppendJoin($", ", returnedProperties, (b, col) => b.Append($"INSERTED.{col.QuotedColumName} AS {col.QuotedColumName}")); + q.AppendJoin($", ", returnedColumns, (b, col) => b.Append($"INSERTED.{col.QuotedColumName} AS {col.QuotedColumName}")); q.AppendLine(); } q.Append("SELECT "); - q.AppendColumns(insertedProperties); + q.AppendColumns(insertedColumns); q.AppendLine(); q.Append($"FROM {source}"); q.AppendLine(); diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteBulkInsertProvider.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteBulkInsertProvider.cs index 447f23b..bd82de2 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteBulkInsertProvider.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteBulkInsertProvider.cs @@ -81,7 +81,7 @@ private static SqliteType GetSqliteType(Type clrType) private static DbCommand GetInsertCommand( DbContext context, string tableName, - IReadOnlyList columns, + IReadOnlyList columns, SqliteType[] columnTypes, StringBuilder sb, int batchSize) @@ -136,19 +136,19 @@ protected override async Task BulkInsert( TableMetadata tableInfo, IEnumerable entities, string tableName, - IReadOnlyList properties, + IReadOnlyList columns, BulkInsertOptions options, CancellationToken ctk ) where T : class { const int maxParams = 1000; var batchSize = options.BatchSize ?? 5; - batchSize = Math.Min(batchSize, maxParams / properties.Count); + batchSize = Math.Min(batchSize, maxParams / columns.Count); // The StringBuilder can be resuse between the batches. var sb = new StringBuilder(); - var columnList = tableInfo.GetProperties(options.CopyGeneratedColumns); + var columnList = tableInfo.GetColumns(options.CopyGeneratedColumns); var columnTypes = columnList.Select(c => GetSqliteType(c.ProviderClrType ?? c.ClrType)).ToArray(); await using var insertCommand = @@ -165,7 +165,7 @@ CancellationToken ctk // Full chunks if (chunk.Length == batchSize) { - FillValues(chunk, insertCommand.Parameters, properties); + FillValues(chunk, insertCommand.Parameters, columns); await ExecuteCommand(sync, insertCommand, ctk); } // Last chunk @@ -180,7 +180,7 @@ CancellationToken ctk sb, chunk.Length); - FillValues(chunk, partialInsertCommand.Parameters, properties); + FillValues(chunk, partialInsertCommand.Parameters, columns); await ExecuteCommand(sync, partialInsertCommand, ctk); } } @@ -199,14 +199,14 @@ private static async Task ExecuteCommand(bool sync, DbCommand insertCommand, Can } } - private static void FillValues(T[] chunk, DbParameterCollection parameters, IReadOnlyList properties) where T : class + private static void FillValues(T[] chunk, DbParameterCollection parameters, IReadOnlyList columns) where T : class { var p = 0; foreach (var entity in chunk) { - foreach (var property in properties) + foreach (var column in columns) { - var value = property.GetValue(entity); + var value = column.GetValue(entity); parameters[p].Value = value; p++; } diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteDialectBuilder.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteDialectBuilder.cs index fa74ead..06e3406 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteDialectBuilder.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteDialectBuilder.cs @@ -11,7 +11,7 @@ internal class SqliteDialectBuilder : SqlDialectBuilder protected override bool SupportsMoveRows => false; /// - public override string CreateTableCopySql(string tempNameName, TableMetadata tableInfo, IReadOnlyList columns) + public override string CreateTableCopySql(string tempNameName, TableMetadata tableInfo, IReadOnlyList columns) { return $"CREATE TEMP TABLE {tempNameName} AS SELECT * FROM {tableInfo.QuotedTableName} WHERE 0;"; } diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderBase.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderBase.cs index 132390f..ace778a 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderBase.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderBase.cs @@ -129,13 +129,13 @@ private async Task PerformBulkInsertAsync( ? await CreateTableCopyAsync(sync, context, options, tableInfo, ctk) : tableInfo.QuotedTableName; - var properties = tableInfo.GetProperties(options.CopyGeneratedColumns); + var columns = tableInfo.GetColumns(options.CopyGeneratedColumns); using var activity = Telemetry.ActivitySource.StartActivity("Insert"); activity?.AddTag("tempTable", tempTableRequired); activity?.AddTag("synchronous", sync); - await BulkInsert(false, context, tableInfo, entities, tableName, properties, options, ctk); + await BulkInsert(false, context, tableInfo, entities, tableName, columns, options, ctk); return tableName; } @@ -148,7 +148,7 @@ protected abstract Task BulkInsert( TableMetadata tableInfo, IEnumerable entities, string tableName, - IReadOnlyList properties, + IReadOnlyList columns, BulkInsertOptions options, CancellationToken ctk) where T : class; @@ -160,7 +160,7 @@ protected async Task CreateTableCopyAsync( CancellationToken ctk) where T : class { var tempTableName = SqlDialect.QuoteTableName(null, GetTempTableName(tableInfo.TableName)); - var tempColumns = tableInfo.GetProperties(options.CopyGeneratedColumns); + var tempColumns = tableInfo.GetColumns(options.CopyGeneratedColumns); var query = SqlDialect.CreateTableCopySql(tempTableName, tableInfo, tempColumns); @@ -195,8 +195,8 @@ protected virtual async Task AddBulkInsertIdColumn( SqlDialect.BuildMoveDataSql( tableInfo, tempTableName, - tableInfo.GetProperties(options.CopyGeneratedColumns), - returnData ? tableInfo.GetProperties() : [], + tableInfo.GetColumns(options.CopyGeneratedColumns), + returnData ? tableInfo.GetColumns() : [], options, onConflict); diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Dialect/SqlDialectBuilder.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Dialect/SqlDialectBuilder.cs index d271cf8..3dc961a 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Dialect/SqlDialectBuilder.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Dialect/SqlDialectBuilder.cs @@ -14,15 +14,15 @@ internal abstract class SqlDialectBuilder protected virtual string ConcatOperator => "||"; protected virtual bool SupportsMoveRows => true; - public abstract string CreateTableCopySql(string tempNameName, TableMetadata tableInfo, IReadOnlyList columns); + public abstract string CreateTableCopySql(string tempNameName, TableMetadata tableInfo, IReadOnlyList columns); /// /// Builds the SQL for moving data from one table to another. /// /// Source table /// Target table name - /// Properties to be inserted - /// Properties to be returned + /// Columns to be inserted + /// Columns to be returned /// Bulk insert options /// On conflict options /// Entity type @@ -30,17 +30,17 @@ internal abstract class SqlDialectBuilder public virtual string BuildMoveDataSql( TableMetadata target, string source, - IReadOnlyList insertedProperties, - IReadOnlyList returnedProperties, + IReadOnlyList insertedColumns, + IReadOnlyList returnedColumns, BulkInsertOptions options, OnConflictOptions? onConflict = null) { var q = new StringBuilder(); if (SupportsMoveRows && options.MoveRows) { - // WITH moved_rows AS (DELETE FROM {source) RETURNING {insertedProperties}) + // WITH moved_rows AS (DELETE FROM {source) RETURNING {insertedColumns}) q.Append($"WITH moved_rows AS (DELETE FROM {source} RETURNING "); - q.AppendColumns(insertedProperties); + q.AppendColumns(insertedColumns); q.AppendLine(")"); source = "moved_rows"; @@ -48,10 +48,10 @@ public virtual string BuildMoveDataSql( // INSERT INTO {target} ({columns}) SELECT {columns} FROM {source} WHERE TRUE q.Append($"INSERT INTO {target.QuotedTableName} ("); - q.AppendColumns(insertedProperties); + q.AppendColumns(insertedColumns); q.AppendLine(")"); q.Append("SELECT "); - q.AppendColumns(insertedProperties); + q.AppendColumns(insertedColumns); q.AppendLine(); q.AppendLine($"FROM {source} WHERE TRUE"); @@ -66,7 +66,7 @@ public virtual string BuildMoveDataSql( if (onConflictTyped.Update != null) { q.Append(' '); - AppendOnConflictUpdate(q, GetUpdates(target, insertedProperties, onConflictTyped.Update)); + AppendOnConflictUpdate(q, GetUpdates(target, insertedColumns, onConflictTyped.Update)); } if (onConflictTyped.Condition != null) @@ -78,14 +78,14 @@ public virtual string BuildMoveDataSql( else { q.Append(' '); - AppendDoNothing(q, insertedProperties); + AppendDoNothing(q, insertedColumns); } } - if (returnedProperties.Count != 0) + if (returnedColumns.Count != 0) { q.Append("RETURNING "); - q.AppendJoin(", ", returnedProperties.Select(p => p.QuotedColumName)); + q.AppendJoin(", ", returnedColumns.Select(p => p.QuotedColumName)); q.AppendLine(); } @@ -95,7 +95,7 @@ public virtual string BuildMoveDataSql( return result; } - protected virtual void AppendDoNothing(StringBuilder sql, IEnumerable insertedProperties) + protected virtual void AppendDoNothing(StringBuilder sql, IEnumerable insertedColumns) { sql.AppendLine("DO NOTHING"); } @@ -178,7 +178,7 @@ protected string[] GetColumns(TableMetadata table, Expression /// var updates = GetUpdates(context, e => e.Prop1); /// /// - protected IEnumerable GetUpdates(TableMetadata table, IEnumerable properties, Expression> update) + protected IEnumerable GetUpdates(TableMetadata table, IEnumerable columns, Expression> update) { switch (update.Body) { @@ -204,7 +204,7 @@ protected IEnumerable GetUpdates(TableMetadata table, IEnumerable(table, memberExpr)}"; break; case ParameterExpression parameterExpr when (parameterExpr.Type == typeof(T)): - foreach (var property in properties) + foreach (var property in columns) { yield return $"{property.QuotedColumName} = {GetExcludedColumnName(property.ColumnName)}"; } diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/EnumerableDataReader.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/EnumerableDataReader.cs index 914b360..d57b43c 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/EnumerableDataReader.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/EnumerableDataReader.cs @@ -4,14 +4,14 @@ namespace PhenX.EntityFrameworkCore.BulkInsert; -internal sealed class EnumerableDataReader(IEnumerable rows, IReadOnlyList properties) : IDataReader +internal sealed class EnumerableDataReader(IEnumerable rows, IReadOnlyList columns) : IDataReader { private readonly IEnumerator _enumerator = rows.GetEnumerator(); private readonly Dictionary _ordinalMap = - properties - .Select((p, i) => (Property: p, Index: i)) + columns + .Select((c, i) => (Column: c, Index: i)) .ToDictionary( - p => p.Property.Name, + p => p.Column.PropertyName, p => p.Index ); @@ -23,7 +23,7 @@ public object GetValue(int i) return DBNull.Value; } - return properties[i].GetValue(current)!; + return columns[i].GetValue(current)!; } public int GetValues(object[] values) @@ -34,21 +34,21 @@ public int GetValues(object[] values) return 0; } - for (var i = 0; i < properties.Count; i++) + for (var i = 0; i < columns.Count; i++) { - values[i] = properties[i].GetValue(current)!; + values[i] = columns[i].GetValue(current)!; } - return properties.Count; + return columns.Count; } public bool Read() => _enumerator.MoveNext(); - public Type GetFieldType(int i) => properties[i].ClrType; + public Type GetFieldType(int i) => columns[i].ClrType; public int GetOrdinal(string name) => _ordinalMap.GetValueOrDefault(name, -1); - public int FieldCount => properties.Count; + public int FieldCount => columns.Count; public int Depth => 0; diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Helpers.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Helpers.cs index 71fd898..f9ff635 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Helpers.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Helpers.cs @@ -23,7 +23,7 @@ public static StringBuilder AppendJoin(this StringBuilder sb, string separato return sb; } - public static StringBuilder AppendColumns(this StringBuilder sb, IReadOnlyList columns) + public static StringBuilder AppendColumns(this StringBuilder sb, IReadOnlyList columns) { return sb.AppendJoin(", ", columns.Select(c => c.QuotedColumName)); } diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/PropertyMetadata.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/ColumnMetadata.cs similarity index 90% rename from src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/PropertyMetadata.cs rename to src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/ColumnMetadata.cs index 33e593b..b640e66 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/PropertyMetadata.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/ColumnMetadata.cs @@ -5,11 +5,11 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.Metadata; -internal sealed class PropertyMetadata(IProperty property, SqlDialectBuilder dialect) +internal sealed class ColumnMetadata(IProperty property, SqlDialectBuilder dialect) { private readonly PropertyAccessor.Getter _getter = BuildGetter(property); - public string Name { get; } = property.Name; + public string PropertyName { get; } = property.Name; public string ColumnName { get; } = property.GetColumnName(); @@ -67,6 +67,6 @@ private static string GetStoreDefinition(IProperty property) public override string ToString() { - return $"Name: {Name}, Column: {ColumnName}"; + return $"Name: {PropertyName}, Column: {ColumnName}"; } } diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/TableMetadata.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/TableMetadata.cs index e6d9574..0968540 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/TableMetadata.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/TableMetadata.cs @@ -7,8 +7,8 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.Metadata; internal sealed class TableMetadata(IEntityType entityType, SqlDialectBuilder dialect) { - private IReadOnlyList? _notGeneratedProperties; - private IReadOnlyList? _primaryKeys; + private IReadOnlyList? _notGeneratedColumns; + private IReadOnlyList? _primaryKeys; public string QuotedTableName { get; } = dialect.QuoteTableName(entityType.GetSchema(), entityType.GetTableName()!); @@ -16,25 +16,25 @@ internal sealed class TableMetadata(IEntityType entityType, SqlDialectBuilder di public string TableName { get; } = entityType.GetTableName() ?? throw new InvalidOperationException("Canot determine table name."); - public IReadOnlyList Properties { get; } = - entityType.GetProperties().Where(p => !p.IsShadowProperty()).Select(x => new PropertyMetadata(x, dialect)).ToList(); + public IReadOnlyList Columns { get; } = + entityType.GetProperties().Where(p => !p.IsShadowProperty()).Select(x => new ColumnMetadata(x, dialect)).ToList(); - public IReadOnlyList PrimaryKey => + public IReadOnlyList PrimaryKey => _primaryKeys ??= GetPrimaryKey(); - public IReadOnlyList GetProperties(bool includeGenerated = true) + public IReadOnlyList GetColumns(bool includeGenerated = true) { if (includeGenerated) { - return Properties; + return Columns; } - return _notGeneratedProperties ??= Properties.Where(x => !x.IsGenerated).ToList(); + return _notGeneratedColumns ??= Columns.Where(x => !x.IsGenerated).ToList(); } public string GetQuotedColumnName(string propertyName) { - var property = Properties.FirstOrDefault(x => x.Name == propertyName) + var property = Columns.FirstOrDefault(x => x.PropertyName == propertyName) ?? throw new InvalidOperationException($"Property {propertyName} not found in entity type {entityType.Name}."); return property.QuotedColumName; @@ -42,16 +42,16 @@ public string GetQuotedColumnName(string propertyName) public string GetColumnName(string propertyName) { - var property = Properties.FirstOrDefault(x => x.Name == propertyName) + var property = Columns.FirstOrDefault(x => x.PropertyName == propertyName) ?? throw new InvalidOperationException($"Property {propertyName} not found in entity type {entityType.Name}."); return property.ColumnName; } - private List GetPrimaryKey() + private List GetPrimaryKey() { var primaryKey = entityType.FindPrimaryKey()?.Properties ?? []; - return Properties.Where(x => primaryKey.Any(y => x.Name == y.Name)).ToList(); + return Columns.Where(x => primaryKey.Any(y => x.PropertyName == y.Name)).ToList(); } }