diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerDialectBuilder.cs b/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerDialectBuilder.cs index 42552f2..a45414f 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerDialectBuilder.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert.SqlServer/SqlServerDialectBuilder.cs @@ -34,7 +34,8 @@ public override string BuildMoveDataSql( { var q = new StringBuilder(); - if (options.CopyGeneratedColumns) + var identityInsert = options.CopyGeneratedColumns && insertedColumns.Any(x => x.IsGenerated); + if (identityInsert) { q.AppendLine($"SET IDENTITY_INSERT {target.QuotedTableName} ON;"); } @@ -129,7 +130,7 @@ public override string BuildMoveDataSql( q.AppendLine(";"); - if (options.CopyGeneratedColumns) + if (identityInsert) { q.AppendLine($"SET IDENTITY_INSERT {target.QuotedTableName} OFF;"); } diff --git a/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/ColumnMetadata.cs b/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/ColumnMetadata.cs index 3d1c899..aedcfab 100644 --- a/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/ColumnMetadata.cs +++ b/src/PhenX.EntityFrameworkCore.BulkInsert/Metadata/ColumnMetadata.cs @@ -22,7 +22,7 @@ internal sealed class ColumnMetadata(IProperty property, SqlDialectBuilder dial public Type ClrType { get; } = property.ClrType; - public bool IsGenerated { get; } = property.ValueGenerated == ValueGenerated.OnAdd; + public bool IsGenerated { get; } = property.ValueGenerated != ValueGenerated.Never; public object? GetValue(object entity, BulkInsertOptions options) { diff --git a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/TestEntityWithGeneratedGuidId.cs b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/TestEntityWithGeneratedGuidId.cs deleted file mode 100644 index 4a8b23a..0000000 --- a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/DbContext/TestEntityWithGeneratedGuidId.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace PhenX.EntityFrameworkCore.BulkInsert.Tests.DbContext; - -[Table("test_entity_generated_guids")] -public class TestEntityWithGeneratedGuidId -{ - [Key] - public Guid Id { get; set; } - - [Column("name")] - [MaxLength(100)] - public string Name { get; set; } = string.Empty; - - [Column("test_run")] - public Guid TestRun { get; set; } -} diff --git a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsBase.cs b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsBase.cs index ca54851..13c114c 100644 --- a/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsBase.cs +++ b/tests/PhenX.EntityFrameworkCore.BulkInsert.Tests/Tests/Basic/BasicTestsBase.cs @@ -261,4 +261,26 @@ await _context.ExecuteBulkInsertAsync(entities, (SqlServerBulkInsertOptions _) = })); } } + + [SkippableTheory] + [CombinatorialData] + public async Task InsertEntities_WithGeneratedGuidId(InsertStrategy strategy) + { + // Arrange + var entities = new List + { + new TestEntityWithGuidId { Id = Guid.NewGuid(), Name = $"{_run}_Entity1" }, + new TestEntityWithGuidId { Id = Guid.NewGuid(), Name = $"{_run}_Entity2" } + }; + + // Act + var insertedEntities = await _context.InsertWithStrategyAsync(strategy, entities, configure => configure.CopyGeneratedColumns = true); + + // Assert + insertedEntities.Should().BeEquivalentTo(entities, + o=> o + .RespectingRuntimeTypes() + .Excluding(e => e.Id) + ); + } }