From 8a5c4d83ece0cb8999a7e325a8bd7966c79f0bae Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Sun, 25 Aug 2024 14:31:28 +0800 Subject: [PATCH] Generate guid's for primary key client side (#257) * Generate guid's for primary key client side --- .../Internal/JetValueGeneratorSelector.cs | 2 +- .../GreenTests/ace_2010_odbc_x86.txt | 43 +++++++++++++++++++ .../GreenTests/ace_2010_oledb_x86.txt | 43 +++++++++++++++++++ .../JetEndToEndTest.cs | 9 ++-- 4 files changed, 92 insertions(+), 5 deletions(-) diff --git a/src/EFCore.Jet/ValueGeneration/Internal/JetValueGeneratorSelector.cs b/src/EFCore.Jet/ValueGeneration/Internal/JetValueGeneratorSelector.cs index 7a34030..1bdacb9 100644 --- a/src/EFCore.Jet/ValueGeneration/Internal/JetValueGeneratorSelector.cs +++ b/src/EFCore.Jet/ValueGeneration/Internal/JetValueGeneratorSelector.cs @@ -40,7 +40,7 @@ namespace EntityFrameworkCore.Jet.ValueGeneration.Internal protected override ValueGenerator? FindForType(IProperty property, ITypeBase typeBase, Type clrType) => property.ClrType.UnwrapNullableType() == typeof(Guid) - ? property.ValueGenerated == ValueGenerated.Never || property.GetDefaultValueSql() != null + ? property.ValueGenerated == ValueGenerated.Never || (property.GetDefaultValueSql() != null && !property.IsPrimaryKey()) ? new TemporaryGuidValueGenerator() : new JetSequentialGuidValueGenerator() : base.FindForType(property, typeBase, clrType); diff --git a/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_odbc_x86.txt b/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_odbc_x86.txt index 1060ce3..9856afb 100644 --- a/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_odbc_x86.txt +++ b/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_odbc_x86.txt @@ -1,5 +1,13 @@ EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Deadlock_on_inserts_and_deletes_with_dependents_is_handled_correctly +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Insertion_order_is_preserved(maxBatchSize: 1) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Insertion_order_is_preserved(maxBatchSize: 100) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Insertion_order_is_preserved(maxBatchSize: 3) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Insertion_order_is_preserved(maxBatchSize: 4) EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_and_updates_are_batched_correctly +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: False, clientFk: False, clientOrder: False) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: False, clientFk: False, clientOrder: True) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: False, clientFk: True, clientOrder: False) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: False, clientFk: True, clientOrder: True) EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: True, clientFk: False, clientOrder: False) EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: True, clientFk: False, clientOrder: True) EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: True, clientFk: True, clientOrder: False) @@ -2675,6 +2683,41 @@ EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_add_and_remove_entit EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_add_table_splitting_dependent_after_principal EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_enumerate_entity_set EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 7) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 7) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 7) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 7) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 7) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 7) EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_non_owner_principal_for_owned EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_TPT_dependents_with_identity EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_remove_multiple_byte_array_as_key diff --git a/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt b/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt index ee572ca..1566f9b 100644 --- a/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt +++ b/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt @@ -1,5 +1,13 @@ EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Deadlock_on_inserts_and_deletes_with_dependents_is_handled_correctly +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Insertion_order_is_preserved(maxBatchSize: 1) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Insertion_order_is_preserved(maxBatchSize: 100) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Insertion_order_is_preserved(maxBatchSize: 3) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Insertion_order_is_preserved(maxBatchSize: 4) EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_and_updates_are_batched_correctly +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: False, clientFk: False, clientOrder: False) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: False, clientFk: False, clientOrder: True) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: False, clientFk: True, clientOrder: False) +EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: False, clientFk: True, clientOrder: True) EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: True, clientFk: False, clientOrder: False) EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: True, clientFk: False, clientOrder: True) EntityFrameworkCore.Jet.FunctionalTests.BatchingTest.Inserts_are_batched_correctly(clientPk: True, clientFk: True, clientOrder: False) @@ -2747,6 +2755,41 @@ EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_add_and_remove_entit EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_add_table_splitting_dependent_after_principal EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_enumerate_entity_set EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 0, courseCount: 7) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 1, courseCount: 7) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 2, courseCount: 7) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 3, courseCount: 7) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 4, courseCount: 7) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 0) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 1) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 2) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 3) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 4) +EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_entities_with_generated_PKs(studentCount: 7, courseCount: 7) EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_non_owner_principal_for_owned EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_insert_TPT_dependents_with_identity EntityFrameworkCore.Jet.FunctionalTests.JetEndToEndTest.Can_remove_multiple_byte_array_as_key diff --git a/test/EFCore.Jet.FunctionalTests/JetEndToEndTest.cs b/test/EFCore.Jet.FunctionalTests/JetEndToEndTest.cs index bb980c5..b503eb8 100644 --- a/test/EFCore.Jet.FunctionalTests/JetEndToEndTest.cs +++ b/test/EFCore.Jet.FunctionalTests/JetEndToEndTest.cs @@ -989,10 +989,11 @@ namespace EntityFrameworkCore.Jet.FunctionalTests Assert.Equal(course.Id, e.CourseId); Assert.Equal(context.Entry(student).Property(e => e.Id).CurrentValue, entry.Property(e => e.StudentId).CurrentValue); Assert.Equal(context.Entry(course).Property(e => e.Id).CurrentValue, entry.Property(e => e.CourseId).CurrentValue); - Assert.True(entry.Property(e => e.StudentId).IsTemporary); - Assert.True(entry.Property(e => e.CourseId).IsTemporary); - Assert.True(context.Entry(student).Property(e => e.Id).IsTemporary); - Assert.True(context.Entry(course).Property(e => e.Id).IsTemporary); + //We generate Guid's client side + Assert.False(entry.Property(e => e.StudentId).IsTemporary); + Assert.False(entry.Property(e => e.CourseId).IsTemporary); + Assert.False(context.Entry(student).Property(e => e.Id).IsTemporary); + Assert.False(context.Entry(course).Property(e => e.Id).IsTemporary); }); context.SaveChanges();