From 7b0752cdf0233d2c319b4112dcac469ac4c761eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20S=C3=A1f=C3=A1r?= Date: Tue, 6 Dec 2022 13:22:48 +0100 Subject: [PATCH] temptable without defaults --- .../BulkOperations/ITempTableBulkInsertOptions.cs | 5 +++++ .../TempTables/ITempTableCreationOptions.cs | 5 +++++ .../TempTables/TempTableCreationOptions.cs | 5 +++++ .../SqlServerBulkOperationTempTableOptions.cs | 8 ++++++++ .../SqlServerTempTableBulkOperationOptions.cs | 8 ++++++++ .../TempTables/SqlServerTempTableCreator.cs | 6 ++++++ .../TempTables/SqlServerTempTableCreatorCacheKey.cs | 12 +++++++++++- .../SqliteTempTableBulkInsertOptions.cs | 3 +++ 8 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/BulkOperations/ITempTableBulkInsertOptions.cs b/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/BulkOperations/ITempTableBulkInsertOptions.cs index d1d02f9e..0c037bb8 100644 --- a/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/BulkOperations/ITempTableBulkInsertOptions.cs +++ b/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/BulkOperations/ITempTableBulkInsertOptions.cs @@ -39,4 +39,9 @@ public interface ITempTableBulkInsertOptions /// Gets properties to insert. /// IEntityPropertiesProvider? PropertiesToInsert { get; } + + /// + /// For temptable creation we should not use defaults + /// + bool DoNotUseDefaultValues { get; } } diff --git a/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/TempTables/ITempTableCreationOptions.cs b/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/TempTables/ITempTableCreationOptions.cs index 512bd428..493c39b5 100644 --- a/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/TempTables/ITempTableCreationOptions.cs +++ b/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/TempTables/ITempTableCreationOptions.cs @@ -43,4 +43,9 @@ public interface ITempTableCreationOptions /// Set to true on re-use. /// bool DropTableOnDispose { get; } + + /// + /// For temptable creation we should not use defaults + /// + bool DoNotUseDefaultValues { get; } } diff --git a/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/TempTables/TempTableCreationOptions.cs b/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/TempTables/TempTableCreationOptions.cs index 41695f90..80cbdafe 100644 --- a/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/TempTables/TempTableCreationOptions.cs +++ b/src/Thinktecture.EntityFrameworkCore.BulkOperations/EntityFrameworkCore/TempTables/TempTableCreationOptions.cs @@ -37,6 +37,9 @@ public IPrimaryKeyPropertiesProvider PrimaryKeyCreation /// public bool DropTableOnDispose { get; set; } + /// + public bool DoNotUseDefaultValues { get; set; } + /// /// Initializes a new instance of . /// @@ -46,6 +49,7 @@ public TempTableCreationOptions(ITempTableCreationOptions? options = null) if (options is null) { DropTableOnDispose = true; + DoNotUseDefaultValues = true; } else { @@ -60,5 +64,6 @@ private void InitializeFrom(ITempTableCreationOptions options) TruncateTableIfExists = options.TruncateTableIfExists; PropertiesToInclude = options.PropertiesToInclude; DropTableOnDispose = options.DropTableOnDispose; + DoNotUseDefaultValues = options.DoNotUseDefaultValues; } } diff --git a/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/BulkOperations/SqlServerBulkOperationTempTableOptions.cs b/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/BulkOperations/SqlServerBulkOperationTempTableOptions.cs index 920d2061..fb0c85a3 100644 --- a/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/BulkOperations/SqlServerBulkOperationTempTableOptions.cs +++ b/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/BulkOperations/SqlServerBulkOperationTempTableOptions.cs @@ -17,6 +17,7 @@ internal SqlServerBulkOperationTempTableOptions(SqlServerBulkOperationTempTableO MomentOfPrimaryKeyCreation = MomentOfSqlServerPrimaryKeyCreation.AfterBulkInsert; DropTableOnDispose = true; EnableStreaming = true; + DoNotUseDefaultValues = true; } else { @@ -31,6 +32,7 @@ internal SqlServerBulkOperationTempTableOptions(SqlServerBulkOperationTempTableO BatchSize = options.BatchSize; EnableStreaming = options.EnableStreaming; UseDefaultDatabaseCollation = options.UseDefaultDatabaseCollation; + DoNotUseDefaultValues = options.DoNotUseDefaultValues; } } @@ -94,6 +96,11 @@ internal SqlServerBulkOperationTempTableOptions(SqlServerBulkOperationTempTableO /// public bool UseDefaultDatabaseCollation { get; set; } + /// + /// Do not use default values + /// + public bool DoNotUseDefaultValues { get; set; } + internal void Populate(SqlServerTempTableBulkInsertOptions options) { options.BatchSize = BatchSize; @@ -106,5 +113,6 @@ internal void Populate(SqlServerTempTableBulkInsertOptions options) options.SqlBulkCopyOptions = SqlBulkCopyOptions; options.UseDefaultDatabaseCollation = UseDefaultDatabaseCollation; options.MomentOfPrimaryKeyCreation = MomentOfPrimaryKeyCreation; + options.DoNotUseDefaultValues = DoNotUseDefaultValues; } } diff --git a/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/BulkOperations/SqlServerTempTableBulkOperationOptions.cs b/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/BulkOperations/SqlServerTempTableBulkOperationOptions.cs index 1d6a0743..4d3b9adf 100644 --- a/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/BulkOperations/SqlServerTempTableBulkOperationOptions.cs +++ b/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/BulkOperations/SqlServerTempTableBulkOperationOptions.cs @@ -1,5 +1,6 @@ using System.Data; using Microsoft.Data.SqlClient; +using Microsoft.Extensions.Options; using Thinktecture.EntityFrameworkCore.TempTables; namespace Thinktecture.EntityFrameworkCore.BulkOperations; @@ -61,6 +62,10 @@ public abstract class SqlServerTempTableBulkOperationOptions : ITempTableBulkIns /// public AdvancedSqlServerTempTableBulkOperationOptions Advanced { get; } + /// + public bool DoNotUseDefaultValues { get; set; } + + /// /// Initializes new instance of . /// @@ -74,6 +79,7 @@ protected SqlServerTempTableBulkOperationOptions(ITempTableBulkInsertOptions? op DropTableOnDispose = true; MomentOfPrimaryKeyCreation = MomentOfSqlServerPrimaryKeyCreation.AfterBulkInsert; EnableStreaming = true; + DoNotUseDefaultValues = true; } else { @@ -82,6 +88,7 @@ protected SqlServerTempTableBulkOperationOptions(ITempTableBulkInsertOptions? op TableNameProvider = optionsToInitializeFrom.TableNameProvider; PrimaryKeyCreation = optionsToInitializeFrom.PrimaryKeyCreation; PropertiesToInsert = optionsToInitializeFrom.PropertiesToInsert; + DoNotUseDefaultValues = optionsToInitializeFrom.DoNotUseDefaultValues; if (optionsToInitializeFrom is SqlServerTempTableBulkOperationOptions sqlServerOptions) { @@ -94,6 +101,7 @@ protected SqlServerTempTableBulkOperationOptions(ITempTableBulkInsertOptions? op MomentOfPrimaryKeyCreation = sqlServerOptions.MomentOfPrimaryKeyCreation; Advanced.UsePropertiesToInsertForTempTableCreation = sqlServerOptions.Advanced.UsePropertiesToInsertForTempTableCreation; + DoNotUseDefaultValues = sqlServerOptions.DoNotUseDefaultValues; } } } diff --git a/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/TempTables/SqlServerTempTableCreator.cs b/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/TempTables/SqlServerTempTableCreator.cs index 568e655a..e25c5348 100644 --- a/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/TempTables/SqlServerTempTableCreator.cs +++ b/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/TempTables/SqlServerTempTableCreator.cs @@ -251,6 +251,12 @@ private string GetColumnsDefinitions(SqlServerTempTableCreatorCacheKey options) sb.Append(property.Property.IsNullable ? " NULL" : " NOT NULL"); + if (options.DoNotUseDefaultValues) + { + isFirst = false; + continue; + } + if (IsIdentityColumn(property)) sb.Append(" IDENTITY"); diff --git a/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/TempTables/SqlServerTempTableCreatorCacheKey.cs b/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/TempTables/SqlServerTempTableCreatorCacheKey.cs index 1ae81092..9cc07464 100644 --- a/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/TempTables/SqlServerTempTableCreatorCacheKey.cs +++ b/src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/TempTables/SqlServerTempTableCreatorCacheKey.cs @@ -25,6 +25,11 @@ public readonly struct SqlServerTempTableCreatorCacheKey /// public IReadOnlyCollection PrimaryKeys { get; } + /// + /// Do not use default values when we create a temp dable + /// + public bool DoNotUseDefaultValues { get; } + /// /// Initializes new instance of . /// @@ -38,6 +43,7 @@ public SqlServerTempTableCreatorCacheKey( UseDefaultDatabaseCollation = options.UseDefaultDatabaseCollation; Properties = options.PropertiesToInclude.DeterminePropertiesForTempTable(entityType, true); PrimaryKeys = options.PrimaryKeyCreation.GetPrimaryKeyProperties(entityType, Properties); + DoNotUseDefaultValues = options.DoNotUseDefaultValues; } /// @@ -46,7 +52,9 @@ public bool Equals(SqlServerTempTableCreatorCacheKey other) return TruncateTableIfExists == other.TruncateTableIfExists && UseDefaultDatabaseCollation == other.UseDefaultDatabaseCollation && Properties.AreEqual(other.Properties) && - PrimaryKeys.AreEqual(other.PrimaryKeys); + PrimaryKeys.AreEqual(other.PrimaryKeys) + && DoNotUseDefaultValues == other.DoNotUseDefaultValues + ; } /// @@ -65,6 +73,8 @@ public override int GetHashCode() Properties.ComputeHashCode(hashCode); PrimaryKeys.ComputeHashCode(hashCode); + hashCode.Add(DoNotUseDefaultValues); + return hashCode.ToHashCode(); } } diff --git a/src/Thinktecture.EntityFrameworkCore.Sqlite/EntityFrameworkCore/BulkOperations/SqliteTempTableBulkInsertOptions.cs b/src/Thinktecture.EntityFrameworkCore.Sqlite/EntityFrameworkCore/BulkOperations/SqliteTempTableBulkInsertOptions.cs index dd7f0a31..04504662 100644 --- a/src/Thinktecture.EntityFrameworkCore.Sqlite/EntityFrameworkCore/BulkOperations/SqliteTempTableBulkInsertOptions.cs +++ b/src/Thinktecture.EntityFrameworkCore.Sqlite/EntityFrameworkCore/BulkOperations/SqliteTempTableBulkInsertOptions.cs @@ -34,6 +34,9 @@ public sealed class SqliteTempTableBulkInsertOptions : ITempTableBulkInsertOptio /// public AdvancedSqliteTempTableBulkInsertOptions Advanced { get; } + /// + public bool DoNotUseDefaultValues { get; set; } + /// /// Initializes new instance of . ///