From 21fe00420f5614c46569a93685845c8eb8f5fbbd Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Sat, 24 May 2025 13:48:10 +0200 Subject: [PATCH] Temp --- .editorconfig | 3 + .../MySqlBulkInsertProvider.cs | 12 +-- .../PostgreSqlBulkInsertProvider.cs | 6 +- .../SqlServerBulkInsertProvider.cs | 5 +- .../SqliteBulkInsertProvider.cs | 5 +- .../Abstractions/IBulkInsertProvider.cs | 6 +- .../BulkInsertOptionsExtension.cs | 7 +- .../BulkInsertProviderBase.cs | 48 ++++-------- .../BulkInsertProviderUntyped.cs | 76 +++++++++++++++++++ .../Dialect/SqlDialectBuilder.cs | 2 +- .../Extensions/PublicExtensions.DbContext.cs | 38 +++++----- .../Extensions/PublicExtensions.DbSet.cs | 38 +++++----- .../Extensions/PublicExtensions.cs | 2 +- .../Metadata/MetadataProviderExtension.cs | 4 +- .../TestDbContext.cs | 9 +-- .../Tests/Basic/BasicTestsBase.cs | 9 +-- .../Tests/Basic/BasicTestsMySql.cs | 5 +- .../Tests/Basic/BasicTestsPostgreSql.cs | 5 +- .../Tests/Basic/BasicTestsSqlServer.cs | 5 +- .../Tests/Basic/BasicTestsSqlite.cs | 5 +- 20 files changed, 153 insertions(+), 137 deletions(-) create mode 100644 src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderUntyped.cs diff --git a/.editorconfig b/.editorconfig index 40dca25..8273cfc 100644 --- a/.editorconfig +++ b/.editorconfig @@ -56,5 +56,8 @@ dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion dotnet_style_predefined_type_for_member_access = true:suggestion +# IDE0090: Use 'new(...)' +dotnet_diagnostic.IDE0090.severity = none + [*.{csproj,proj,targets}] indent_size = 2 \ No newline at end of file diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlBulkInsertProvider.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlBulkInsertProvider.cs index ff32163..2a81685 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlBulkInsertProvider.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlBulkInsertProvider.cs @@ -9,12 +9,8 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.MySql; -internal class MySqlBulkInsertProvider : BulkInsertProviderBase +internal class MySqlBulkInsertProvider(ILogger? logger = null) : BulkInsertProviderBase(logger) { - public MySqlBulkInsertProvider(ILogger? logger = null) : base(logger) - { - } - //language=sql /// protected override string AddTableCopyBulkInsertId => $"ALTER TABLE {{0}} ADD {BulkInsertId} INT AUTO_INCREMENT PRIMARY KEY;"; @@ -26,13 +22,13 @@ public MySqlBulkInsertProvider(ILogger? logger = null) protected override MySqlBulkInsertOptions CreateDefaultOptions() => new(); /// - public override IAsyncEnumerable BulkInsertReturnEntities( + protected override IAsyncEnumerable BulkInsertReturnEntities( bool sync, DbContext context, TableMetadata tableInfo, IEnumerable entities, - BulkInsertOptions options, - OnConflictOptions? onConflict = null, + MySqlBulkInsertOptions options, + OnConflictOptions? onConflict = null, CancellationToken ctk = default) { throw new NotSupportedException("Provider does not support returning entities."); diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlBulkInsertProvider.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlBulkInsertProvider.cs index 4dd86a2..89f6b50 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlBulkInsertProvider.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.PostgreSql/PostgreSqlBulkInsertProvider.cs @@ -13,12 +13,8 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.PostgreSql; [UsedImplicitly] -internal class PostgreSqlBulkInsertProvider : BulkInsertProviderBase +internal class PostgreSqlBulkInsertProvider(ILogger? logger = null) : BulkInsertProviderBase(logger) { - public PostgreSqlBulkInsertProvider(ILogger? logger = null) : base(logger) - { - } - //language=sql /// protected override string AddTableCopyBulkInsertId => $"ALTER TABLE {{0}} ADD COLUMN {BulkInsertId} SERIAL PRIMARY KEY;"; diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerBulkInsertProvider.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerBulkInsertProvider.cs index 1efbbb4..9bd7197 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerBulkInsertProvider.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerBulkInsertProvider.cs @@ -11,11 +11,8 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.SqlServer; [UsedImplicitly] -internal class SqlServerBulkInsertProvider : BulkInsertProviderBase +internal class SqlServerBulkInsertProvider(ILogger? logger = null) : BulkInsertProviderBase(logger) { - public SqlServerBulkInsertProvider(ILogger? logger = null) : base(logger) - { - } //language=sql /// diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteBulkInsertProvider.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteBulkInsertProvider.cs index 439d0f2..fdbc452 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteBulkInsertProvider.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.Sqlite/SqliteBulkInsertProvider.cs @@ -13,11 +13,8 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.Sqlite; [UsedImplicitly] -internal class SqliteBulkInsertProvider : BulkInsertProviderBase +internal class SqliteBulkInsertProvider(ILogger? logger = null) : BulkInsertProviderBase(logger) { - public SqliteBulkInsertProvider(ILogger? logger = null) : base(logger) - { - } /// protected override string BulkInsertId => "rowid"; diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Abstractions/IBulkInsertProvider.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Abstractions/IBulkInsertProvider.cs index a8fa8e6..e7e8756 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Abstractions/IBulkInsertProvider.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Abstractions/IBulkInsertProvider.cs @@ -20,7 +20,7 @@ internal IAsyncEnumerable BulkInsertReturnEntities( TableMetadata tableInfo, IEnumerable entities, BulkInsertOptions options, - OnConflictOptions? onConflict = null, + OnConflictOptions? onConflict = null, CancellationToken ctk = default ) where T : class; @@ -33,7 +33,7 @@ internal Task BulkInsert( TableMetadata tableInfo, IEnumerable entities, BulkInsertOptions options, - OnConflictOptions? onConflict = null, + OnConflictOptions? onConflict = null, CancellationToken ctk = default ) where T : class; @@ -42,5 +42,5 @@ internal Task BulkInsert( /// /// Make the default options for the provider, can be a subclass of . /// - internal BulkInsertOptions InternalCreateDefaultOptions(); + internal BulkInsertOptions CreateDefaultOptions(); } diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertOptionsExtension.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertOptionsExtension.cs index ebd131b..42a7ffa 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertOptionsExtension.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertOptionsExtension.cs @@ -1,4 +1,4 @@ -using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.Extensions.DependencyInjection; using PhenX.EntityFrameworkCore.BulkInsert.Abstractions; @@ -20,11 +20,8 @@ public void Validate(IDbContextOptions options) { } - private class BulkInsertOptionsExtensionInfo : DbContextOptionsExtensionInfo + private class BulkInsertOptionsExtensionInfo(IDbContextOptionsExtension extension) : DbContextOptionsExtensionInfo(extension) { - public BulkInsertOptionsExtensionInfo(IDbContextOptionsExtension extension) - : base(extension) { } - /// public override int GetServiceProviderHashCode() => 0; diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderBase.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderBase.cs index 48fa384..4cb5bd6 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderBase.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderBase.cs @@ -4,7 +4,6 @@ using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.Logging; -using PhenX.EntityFrameworkCore.BulkInsert.Abstractions; using PhenX.EntityFrameworkCore.BulkInsert.Dialect; using PhenX.EntityFrameworkCore.BulkInsert.Extensions; using PhenX.EntityFrameworkCore.BulkInsert.Metadata; @@ -12,41 +11,25 @@ namespace PhenX.EntityFrameworkCore.BulkInsert; -internal abstract class BulkInsertProviderBase(ILogger>? logger = null) : IBulkInsertProvider +internal abstract class BulkInsertProviderBase(ILogger? logger = null) : BulkInsertProviderUntyped where TDialect : SqlDialectBuilder, new() where TOptions : BulkInsertOptions, new() { - protected readonly TDialect SqlDialect = new(); - protected virtual string BulkInsertId => "_bulk_insert_id"; protected abstract string AddTableCopyBulkInsertId { get; } protected virtual string GetTempTableName(string tableName) => $"_temp_bulk_insert_{tableName}"; - SqlDialectBuilder IBulkInsertProvider.SqlDialect => SqlDialect; - - public BulkInsertOptions InternalCreateDefaultOptions() => CreateDefaultOptions(); - - /// - /// Create the default options for the provider, can be a subclass of . - /// - protected abstract TOptions CreateDefaultOptions(); - - public virtual async IAsyncEnumerable BulkInsertReturnEntities( + protected override async IAsyncEnumerable BulkInsertReturnEntities( bool sync, DbContext context, TableMetadata tableInfo, IEnumerable entities, - BulkInsertOptions options, - OnConflictOptions? onConflict, + TOptions options, + OnConflictOptions? onConflict, [EnumeratorCancellation] CancellationToken ctk) where T : class { - if (options is not TOptions providerOptions) - { - throw new InvalidOperationException($"Invalid options type: {options.GetType().Name}. Expected: {typeof(TOptions).Name}"); - } - using var activity = Telemetry.ActivitySource.StartActivity("BulkInsertReturnEntities"); activity?.AddTag("tableName", tableInfo.TableName); activity?.AddTag("synchronous", sync); @@ -59,10 +42,10 @@ public virtual async IAsyncEnumerable BulkInsertReturnEntities( Log.UsingTempTablToReturnData(logger); } - var tableName = await PerformBulkInsertAsync(sync, context, tableInfo, entities, providerOptions, tempTableRequired: true, ctk: ctk); + var tableName = await PerformBulkInsertAsync(sync, context, tableInfo, entities, options, tempTableRequired: true, ctk: ctk); var result = - await CopyFromTempTableAsync(sync, context, tableInfo, tableName, true, providerOptions, onConflict, ctk: ctk) + await CopyFromTempTableAsync(sync, context, tableInfo, tableName, true, options, onConflict, ctk: ctk) ?? throw new InvalidOperationException("Copy returns null enumerable."); await foreach (var item in result.WithCancellation(ctk)) @@ -79,20 +62,15 @@ await CopyFromTempTableAsync(sync, context, tableInfo, tableName, true, pr } } - public virtual async Task BulkInsert( + protected override async Task BulkInsert( bool sync, DbContext context, TableMetadata tableInfo, IEnumerable entities, - BulkInsertOptions options, - OnConflictOptions? onConflict, + TOptions options, + OnConflictOptions? onConflict, CancellationToken ctk) where T : class { - if (options is not TOptions providerOptions) - { - throw new InvalidOperationException($"Invalid options type: {options.GetType().Name}. Expected: {typeof(TOptions).Name}"); - } - using var activity = Telemetry.ActivitySource.StartActivity("BulkInsert"); activity?.AddTag("tableName", tableInfo.TableName); activity?.AddTag("synchronous", sync); @@ -107,9 +85,9 @@ public virtual async Task BulkInsert( Log.UsingTempTableToResolveConflicts(logger); } - var tableName = await PerformBulkInsertAsync(sync, context, tableInfo, entities, providerOptions, tempTableRequired: true, ctk: ctk); + var tableName = await PerformBulkInsertAsync(sync, context, tableInfo, entities, options, tempTableRequired: true, ctk: ctk); - await CopyFromTempTableAsync(sync, context, tableInfo, tableName, false, providerOptions, onConflict, ctk); + await CopyFromTempTableAsync(sync, context, tableInfo, tableName, false, options, onConflict, ctk); } else { @@ -118,7 +96,7 @@ public virtual async Task BulkInsert( Log.UsingDirectInsert(logger); } - await PerformBulkInsertAsync(sync, context, tableInfo, entities, providerOptions, tempTableRequired: false, ctk: ctk); + await PerformBulkInsertAsync(sync, context, tableInfo, entities, options, tempTableRequired: false, ctk: ctk); } // Commit the transaction if we own them. @@ -207,7 +185,7 @@ protected virtual async Task AddBulkInsertIdColumn( string tempTableName, bool returnData, TOptions options, - OnConflictOptions? onConflict, + OnConflictOptions? onConflict, CancellationToken ctk) where T : class where TResult : class { var query = diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderUntyped.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderUntyped.cs new file mode 100644 index 0000000..baab9b2 --- /dev/null +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderUntyped.cs @@ -0,0 +1,76 @@ +using Microsoft.EntityFrameworkCore; + +using PhenX.EntityFrameworkCore.BulkInsert.Abstractions; +using PhenX.EntityFrameworkCore.BulkInsert.Dialect; +using PhenX.EntityFrameworkCore.BulkInsert.Metadata; +using PhenX.EntityFrameworkCore.BulkInsert.Options; + +namespace PhenX.EntityFrameworkCore.BulkInsert; + +internal abstract class BulkInsertProviderUntyped : IBulkInsertProvider + where TDialect : SqlDialectBuilder, new() + where TOptions : BulkInsertOptions, new() +{ + protected readonly TDialect SqlDialect = new(); + + SqlDialectBuilder IBulkInsertProvider.SqlDialect => SqlDialect; + + BulkInsertOptions IBulkInsertProvider.CreateDefaultOptions() => CreateDefaultOptions(); + + /// + /// Create the default options for the provider, can be a subclass of . + /// + protected abstract TOptions CreateDefaultOptions(); + + public IAsyncEnumerable BulkInsertReturnEntities( + bool sync, + DbContext context, + TableMetadata tableInfo, + IEnumerable entities, + BulkInsertOptions options, + OnConflictOptions? onConflict, + CancellationToken ctk) where T : class + { + if (options is not TOptions providerOptions) + { + throw new InvalidOperationException($"Invalid options type: {options.GetType().Name}. Expected: {typeof(TOptions).Name}"); + } + + return BulkInsertReturnEntities(sync, context, tableInfo, entities, providerOptions, onConflict, ctk); + } + + protected abstract IAsyncEnumerable BulkInsertReturnEntities( + bool sync, + DbContext context, + TableMetadata tableInfo, + IEnumerable entities, + TOptions options, + OnConflictOptions? onConflict, + CancellationToken ctk) where T : class; + + public Task BulkInsert( + bool sync, + DbContext context, + TableMetadata tableInfo, + IEnumerable entities, + BulkInsertOptions options, + OnConflictOptions? onConflict, + CancellationToken ctk) where T : class + { + if (options is not TOptions providerOptions) + { + throw new InvalidOperationException($"Invalid options type: {options.GetType().Name}. Expected: {typeof(TOptions).Name}"); + } + + return BulkInsert(sync, context, tableInfo, entities, providerOptions, onConflict, ctk); + } + + protected abstract Task BulkInsert( + bool sync, + DbContext context, + TableMetadata tableInfo, + IEnumerable entities, + TOptions options, + OnConflictOptions? onConflict, + CancellationToken ctk) where T : class; +} diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Dialect/SqlDialectBuilder.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Dialect/SqlDialectBuilder.cs index 3dc961a..801d044 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Dialect/SqlDialectBuilder.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Dialect/SqlDialectBuilder.cs @@ -154,7 +154,7 @@ public string QuoteTableName(string? schema, string tableName) /// /// Gets column names for the insert statement, from an object initializer. /// - protected string[] GetColumns(TableMetadata table, Expression> columns) + protected static string[] GetColumns(TableMetadata table, Expression> columns) { return columns.Body switch { diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.DbContext.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.DbContext.cs index 9bc410b..d4f14e4 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.DbContext.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.DbContext.cs @@ -1,4 +1,4 @@ -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; using PhenX.EntityFrameworkCore.BulkInsert.Options; @@ -60,7 +60,7 @@ public static Task> ExecuteBulkInsertReturnEntitiesAsync( IEnumerable entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class where TConfig : BulkInsertOptions @@ -68,7 +68,7 @@ public static Task> ExecuteBulkInsertReturnEntitiesAsync( var dbSet = dbContext.Set() ?? throw new InvalidOperationException($"DbSet of type {typeof(T).Name} not found in DbContext."); - return ExecuteBulkInsertReturnEntitiesCoreAsync(dbSet,false, entities, configure, onConflict, ctk); + return ExecuteBulkInsertReturnEntitiesCoreAsync(dbSet,false, entities, configure, onConflict, cancellationToken); } /// @@ -79,11 +79,11 @@ public static Task> ExecuteBulkInsertReturnEntitiesAsync( IEnumerable entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - return ExecuteBulkInsertReturnEntitiesAsync(dbContext, entities, configure, onConflict, ctk); + return ExecuteBulkInsertReturnEntitiesAsync(dbContext, entities, configure, onConflict, cancellationToken); } /// @@ -93,11 +93,11 @@ public static Task> ExecuteBulkInsertReturnEntitiesAsync( this DbContext dbContext, IEnumerable entities, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - return ExecuteBulkInsertReturnEntitiesAsync(dbContext, entities, _ => { }, onConflict, ctk); + return ExecuteBulkInsertReturnEntitiesAsync(dbContext, entities, _ => { }, onConflict, cancellationToken); } /// @@ -108,7 +108,7 @@ public static IAsyncEnumerable ExecuteBulkInsertReturnEnumerableAsync entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class where TConfig : BulkInsertOptions @@ -116,7 +116,7 @@ public static IAsyncEnumerable ExecuteBulkInsertReturnEnumerableAsync() ?? throw new InvalidOperationException($"DbSet of type {typeof(T).Name} not found in DbContext."); - return dbSet.ExecuteBulkInsertReturnEnumerableAsync(entities, configure, onConflict, ctk); + return dbSet.ExecuteBulkInsertReturnEnumerableAsync(entities, configure, onConflict, cancellationToken); } /// @@ -127,10 +127,10 @@ public static IAsyncEnumerable ExecuteBulkInsertReturnEnumerableAsync( IEnumerable entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - return ExecuteBulkInsertReturnEnumerableAsync(dbContext, entities, configure, onConflict, ctk); + return ExecuteBulkInsertReturnEnumerableAsync(dbContext, entities, configure, onConflict, cancellationToken); } /// @@ -140,10 +140,10 @@ public static IAsyncEnumerable ExecuteBulkInsertReturnEnumerableAsync( this DbContext dbContext, IEnumerable entities, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - return ExecuteBulkInsertReturnEnumerableAsync(dbContext, entities, _ => { }, onConflict, ctk); + return ExecuteBulkInsertReturnEnumerableAsync(dbContext, entities, _ => { }, onConflict, cancellationToken); } /// @@ -154,7 +154,7 @@ public static async Task ExecuteBulkInsertAsync( IEnumerable entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class where TConfig : BulkInsertOptions @@ -162,7 +162,7 @@ public static async Task ExecuteBulkInsertAsync( var dbSet = dbContext.Set() ?? throw new InvalidOperationException($"DbSet of type {typeof(T).Name} not found in DbContext."); - await dbSet.ExecuteBulkInsertAsync(entities, configure, onConflict, ctk); + await dbSet.ExecuteBulkInsertAsync(entities, configure, onConflict, cancellationToken); } /// @@ -173,11 +173,11 @@ public static async Task ExecuteBulkInsertAsync( IEnumerable entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - await ExecuteBulkInsertAsync(dbContext, entities, configure, onConflict, ctk); + await ExecuteBulkInsertAsync(dbContext, entities, configure, onConflict, cancellationToken); } /// @@ -187,11 +187,11 @@ public static async Task ExecuteBulkInsertAsync( this DbContext dbContext, IEnumerable entities, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - await ExecuteBulkInsertAsync(dbContext, entities, _ => { }, onConflict, ctk); + await ExecuteBulkInsertAsync(dbContext, entities, _ => { }, onConflict, cancellationToken); } /// diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.DbSet.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.DbSet.cs index c7cd183..b0bc7ea 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.DbSet.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.DbSet.cs @@ -1,4 +1,4 @@ -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; using PhenX.EntityFrameworkCore.BulkInsert.Options; @@ -57,12 +57,12 @@ public static Task> ExecuteBulkInsertReturnEntitiesAsync( IEnumerable entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class where TOptions : BulkInsertOptions { - return ExecuteBulkInsertReturnEntitiesCoreAsync(dbSet, false, entities, configure, onConflict, ctk); + return ExecuteBulkInsertReturnEntitiesCoreAsync(dbSet, false, entities, configure, onConflict, cancellationToken); } /// @@ -73,11 +73,11 @@ public static Task> ExecuteBulkInsertReturnEntitiesAsync( IEnumerable entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - return ExecuteBulkInsertReturnEntitiesAsync(dbSet, entities, configure, onConflict, ctk); + return ExecuteBulkInsertReturnEntitiesAsync(dbSet, entities, configure, onConflict, cancellationToken); } /// @@ -87,11 +87,11 @@ public static Task> ExecuteBulkInsertReturnEntitiesAsync( this DbSet dbSet, IEnumerable entities, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - return ExecuteBulkInsertReturnEntitiesAsync(dbSet, entities, _ => { }, onConflict, ctk); + return ExecuteBulkInsertReturnEntitiesAsync(dbSet, entities, _ => { }, onConflict, cancellationToken); } /// @@ -102,7 +102,7 @@ public static IAsyncEnumerable ExecuteBulkInsertReturnEnumerableAsync entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class where TOptions : BulkInsertOptions @@ -110,7 +110,7 @@ public static IAsyncEnumerable ExecuteBulkInsertReturnEnumerableAsync(), entities, - options, onConflict, ctk); + options, onConflict, cancellationToken); } /// @@ -121,11 +121,11 @@ public static IAsyncEnumerable ExecuteBulkInsertReturnEnumerableAsync( IEnumerable entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - return ExecuteBulkInsertReturnEnumerableAsync(dbSet, entities, configure, onConflict, ctk); + return ExecuteBulkInsertReturnEnumerableAsync(dbSet, entities, configure, onConflict, cancellationToken); } /// @@ -135,11 +135,11 @@ public static IAsyncEnumerable ExecuteBulkInsertReturnEnumerableAsync( this DbSet dbSet, IEnumerable entities, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - return ExecuteBulkInsertReturnEnumerableAsync(dbSet, entities, _ => { }, onConflict, ctk); + return ExecuteBulkInsertReturnEnumerableAsync(dbSet, entities, _ => { }, onConflict, cancellationToken); } /// @@ -150,7 +150,7 @@ public static async Task ExecuteBulkInsertAsync( IEnumerable entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class where TOptions : BulkInsertOptions @@ -158,7 +158,7 @@ public static async Task ExecuteBulkInsertAsync( var provider = InitProvider(dbSet, configure, out var context, out var options); await provider.BulkInsert(false, context, dbSet.GetDbContext().GetTableInfo(), entities, options, onConflict, - ctk); + cancellationToken); } /// @@ -169,11 +169,11 @@ public static async Task ExecuteBulkInsertAsync( IEnumerable entities, Action configure, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - await ExecuteBulkInsertAsync(dbSet, entities, configure, onConflict, ctk); + await ExecuteBulkInsertAsync(dbSet, entities, configure, onConflict, cancellationToken); } /// @@ -183,11 +183,11 @@ public static async Task ExecuteBulkInsertAsync( this DbSet dbSet, IEnumerable entities, OnConflictOptions? onConflict = null, - CancellationToken ctk = default + CancellationToken cancellationToken = default ) where T : class { - await ExecuteBulkInsertAsync(dbSet, entities, _ => { }, onConflict, ctk); + await ExecuteBulkInsertAsync(dbSet, entities, _ => { }, onConflict, cancellationToken); } /// diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.cs index 4dcc850..725b37d 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.cs @@ -52,7 +52,7 @@ out TOptions options context = dbSet.GetDbContext(); var provider = context.GetService(); - var defaultOptions = provider.InternalCreateDefaultOptions(); + var defaultOptions = provider.CreateDefaultOptions(); if (defaultOptions is not TOptions castedOptions) { diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/MetadataProviderExtension.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/MetadataProviderExtension.cs index 3fe2a20..9774f1d 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/MetadataProviderExtension.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/MetadataProviderExtension.cs @@ -17,10 +17,8 @@ public void Validate(IDbContextOptions options) { } - private class MetadataProviderExtensionInfo : DbContextOptionsExtensionInfo + private class MetadataProviderExtensionInfo(IDbContextOptionsExtension extension) : DbContextOptionsExtensionInfo(extension) { - public MetadataProviderExtensionInfo(IDbContextOptionsExtension extension) - : base(extension) { } /// public override int GetServiceProviderHashCode() => 0; diff --git a/tests/PhenX.EntityFrameworkCore.BulkInsert.Benchmark/TestDbContext.cs b/tests/PhenX.EntityFrameworkCore.BulkInsert.Benchmark/TestDbContext.cs index 8b31a5d..0e09a4b 100644 --- a/tests/PhenX.EntityFrameworkCore.BulkInsert.Benchmark/TestDbContext.cs +++ b/tests/PhenX.EntityFrameworkCore.BulkInsert.Benchmark/TestDbContext.cs @@ -2,17 +2,12 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.Benchmark; -public class TestDbContext : DbContext +public class TestDbContext(Action configure) : DbContext { - public Action Configure { get; } + public Action Configure { get; } = configure; public DbSet TestEntities { get; set; } = null!; - public TestDbContext(Action configure) - { - Configure = configure; - } - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { Configure(optionsBuilder); diff --git a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsBase.cs b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsBase.cs index d344a1c..c255771 100644 --- a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsBase.cs +++ b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsBase.cs @@ -10,17 +10,12 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.Tests.Tests.Basic; -public abstract class BasicTestsBase : IClassFixture, IAsyncLifetime +public abstract class BasicTestsBase(TestDbContainer dbContainer) : IClassFixture, IAsyncLifetime where TFixture : TestDbContainer { private readonly Guid _run = Guid.NewGuid(); private TestDbContext _context = null!; - protected BasicTestsBase(TestDbContainer dbContainer) - { - DbContainer = dbContainer; - } - public async Task InitializeAsync() { _context = await DbContainer.CreateContextAsync(); @@ -32,7 +27,7 @@ public Task DisposeAsync() return Task.CompletedTask; } - protected TestDbContainer DbContainer { get; } + protected TestDbContainer DbContainer { get; } = dbContainer; [Fact] public async Task InsertsEntitiesSuccessfully() diff --git a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsMySql.cs b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsMySql.cs index 9181409..9cc0293 100644 --- a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsMySql.cs +++ b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsMySql.cs @@ -6,9 +6,6 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.Tests.Tests.Basic; [Trait("Category", "MySql")] -public class BasicTestsMySql : BasicTestsBase> +public class BasicTestsMySql(TestDbContainerMySql dbContainer) : BasicTestsBase>(dbContainer) { - public BasicTestsMySql(TestDbContainerMySql dbContainer) : base(dbContainer) - { - } } diff --git a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsPostgreSql.cs b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsPostgreSql.cs index f1a9cf4..0737ea3 100644 --- a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsPostgreSql.cs +++ b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsPostgreSql.cs @@ -6,9 +6,6 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.Tests.Tests.Basic; [Trait("Category", "PostgreSql")] -public class BasicTestsPostgreSql : BasicTestsBase> +public class BasicTestsPostgreSql(TestDbContainerPostgreSql dbContainer) : BasicTestsBase>(dbContainer) { - public BasicTestsPostgreSql(TestDbContainerPostgreSql dbContainer) : base(dbContainer) - { - } } diff --git a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsSqlServer.cs b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsSqlServer.cs index 0d658e4..02957c5 100644 --- a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsSqlServer.cs +++ b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsSqlServer.cs @@ -6,9 +6,6 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.Tests.Tests.Basic; [Trait("Category", "SqlServer")] -public class BasicTestsSqlServer : BasicTestsBase> +public class BasicTestsSqlServer(TestDbContainerSqlServer dbContainer) : BasicTestsBase>(dbContainer) { - public BasicTestsSqlServer(TestDbContainerSqlServer dbContainer) : base(dbContainer) - { - } } diff --git a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsSqlite.cs b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsSqlite.cs index 0aabe0a..321951a 100644 --- a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsSqlite.cs +++ b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsSqlite.cs @@ -6,10 +6,7 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.Tests.Tests.Basic; [Trait("Category", "Sqlite")] -public class BasicTestsSqlite : BasicTestsBase> +public class BasicTestsSqlite(TestDbContainerSqlite dbContainer) : BasicTestsBase>(dbContainer) { - public BasicTestsSqlite(TestDbContainerSqlite dbContainer) : base(dbContainer) - { - } }