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 445632f..2b2ef20 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlBulkInsertProvider.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.MySql/MySqlBulkInsertProvider.cs @@ -1,3 +1,5 @@ +using JetBrains.Annotations; + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.Logging; @@ -9,6 +11,7 @@ namespace PhenX.EntityFrameworkCore.BulkInsert.MySql; +[UsedImplicitly] internal class MySqlBulkInsertProvider(ILogger logger) : BulkInsertProviderBase(logger) { //language=sql @@ -22,13 +25,13 @@ internal class MySqlBulkInsertProvider(ILogger logger) 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/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 b62d69c..6060e64 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertOptionsExtension.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertOptionsExtension.cs @@ -26,7 +26,6 @@ public void Validate(IDbContextOptions options) private class BulkInsertOptionsExtensionInfo(IDbContextOptionsExtension extension) : DbContextOptionsExtensionInfo(extension) { - /// public override int GetServiceProviderHashCode() => 0; diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderBase.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/BulkInsertProviderBase.cs index 0e1d11e..bf9ea0f 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) : IBulkInsertProvider +internal abstract class BulkInsertProviderBase(ILogger? logger) : 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.UsingTempTableToReturnData(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 5aa9aef..83ab641 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.DbSet.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.DbSet.cs @@ -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, context, options) = InitProvider(dbSet, configure); 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 cdcdf6e..25e46ed 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Extensions/PublicExtensions.cs @@ -49,8 +49,7 @@ private static (IBulkInsertProvider, DbContext, TOptions) InitProvider(); - var options = provider.InternalCreateDefaultOptions(); - + var options = provider.CreateDefaultOptions(); if (options is not TOptions castedOptions) { throw new InvalidOperationException($"Options type mismatch. Expected {options.GetType().Name}, but got {typeof(TOptions).Name}.");