From 030ee646aa74607d95732ac4c0ea06c8d464eb2f Mon Sep 17 00:00:00 2001 From: Arthur Vickers Date: Mon, 4 Jan 2021 15:12:48 -0800 Subject: [PATCH] [5.0.3/Tests only] Updates many-to-many change tracking tests to work with generated key values This is a precursor to fixes for #23659, #23787. This test has no product changes, it just refactors the many-to-many tests so that they can be run with generated key values, as well as running with explicit keys values like they currently do. Generated keys result in more work being done in fixup by navigations, which is where both of these issues live. Once this is merged I will send out separate PRs to fix the two bugs. --- .../ManyToManyTrackingTestBase.cs | 1866 +++++++++++----- .../Query/ManyToManyQueryFixtureBase.cs | 22 +- .../ManyToManyModel/ManyToManyContext.cs | 3 - .../ManyToManyModel/ManyToManyData.cs | 1944 ++++++++--------- ...oManyTrackingGeneratedKeysSqlServerTest.cs | 38 + ...TrackingProxyGeneratedKeysSqlServerTest.cs | 71 + 6 files changed, 2270 insertions(+), 1674 deletions(-) create mode 100644 test/EFCore.SqlServer.FunctionalTests/ManyToManyTrackingGeneratedKeysSqlServerTest.cs create mode 100644 test/EFCore.SqlServer.FunctionalTests/ManyToManyTrackingProxyGeneratedKeysSqlServerTest.cs diff --git a/test/EFCore.Specification.Tests/ManyToManyTrackingTestBase.cs b/test/EFCore.Specification.Tests/ManyToManyTrackingTestBase.cs index 24666d65680..aa810e81d30 100644 --- a/test/EFCore.Specification.Tests/ManyToManyTrackingTestBase.cs +++ b/test/EFCore.Specification.Tests/ManyToManyTrackingTestBase.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -23,6 +24,8 @@ public abstract class ManyToManyTrackingTestBase : IClassFixture keys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { @@ -31,30 +34,30 @@ await ExecuteWithStrategyInTransactionAsync( context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7711; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7711; e.Key2 = "7711"; e.Key3 = new DateTime(7711, 1, 1); }), context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7712; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7712; e.Key2 = "7712"; e.Key3 = new DateTime(7712, 1, 1); }), context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7713; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7713; e.Key2 = "7713"; e.Key3 = new DateTime(7713, 1, 1); }), }; var rightEntities = new[] { - context.Set().CreateInstance((e, p) => e.Id = 7721), - context.Set().CreateInstance((e, p) => e.Id = 7722), - context.Set().CreateInstance((e, p) => e.Id = 7723) + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].LeafSkipFull = CreateCollection(); @@ -92,18 +95,20 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities); + + keys = leftEntities.Select(e => e.Key1).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Key1 > 7700).Include(e => e.LeafSkipFull); + var queryable = context.Set().Where(e => keys.Contains(e.Key1)).Include(e => e.LeafSkipFull); var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(3, results.Count); var leftEntities = context.ChangeTracker.Entries() - .Select(e => e.Entity).OrderBy(e => e.Key1).ToList(); + .Select(e => e.Entity).OrderBy(e => e.Key2).ToList(); var rightEntities = context.ChangeTracker.Entries() - .Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + .Select(e => e.Entity).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities); }); @@ -142,52 +147,80 @@ public virtual void Can_update_many_to_many_composite_with_navs() ExecuteWithStrategyInTransaction( context => { - var leftEntities = context.Set().Include(e => e.LeafSkipFull).OrderBy(e => e.Key1).ToList(); - var rightEntities = context.Set().Include(e => e.CompositeKeySkipFull).ToList(); + var leftEntities = context.Set().Include(e => e.LeafSkipFull).OrderBy(e => e.Key2).ToList(); + var rightEntities = context.Set().Include(e => e.CompositeKeySkipFull).OrderBy(e => e.Name).ToList(); - leftEntities[0].LeafSkipFull.Add(context.Set().CreateInstance((e, p) => e.Id = 7721)); - leftEntities[0].LeafSkipFull.Add(context.Set().CreateInstance((e, p) => e.Id = 7722)); - leftEntities[0].LeafSkipFull.Add(context.Set().CreateInstance((e, p) => e.Id = 7723)); + leftEntities[0].LeafSkipFull.Add( + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + })); + leftEntities[0].LeafSkipFull.Add( + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + })); + leftEntities[0].LeafSkipFull.Add( + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + })); rightEntities[0].CompositeKeySkipFull.Add( context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7711; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7711; e.Key2 = "7711"; e.Key3 = new DateTime(7711, 1, 1); + e.Name = "Z7711"; })); rightEntities[0].CompositeKeySkipFull.Add( context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7712; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7712; e.Key2 = "7712"; e.Key3 = new DateTime(7712, 1, 1); + e.Name = "Z7712"; })); rightEntities[0].CompositeKeySkipFull.Add( context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7713; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7713; e.Key2 = "7713"; e.Key3 = new DateTime(7713, 1, 1); + e.Name = "Z7713"; })); - leftEntities[0].LeafSkipFull.Remove(leftEntities[0].LeafSkipFull.Single(e => e.Id == 21)); + leftEntities[0].LeafSkipFull.Remove(leftEntities[0].LeafSkipFull.Single(e => e.Name == "Leaf 1")); rightEntities[1].CompositeKeySkipFull.Remove(rightEntities[1].CompositeKeySkipFull.Single(e => e.Key2 == "3_1")); - leftEntities[2].LeafSkipFull.Remove(leftEntities[2].LeafSkipFull.Single(e => e.Id == 23)); - leftEntities[2].LeafSkipFull.Add(context.Set().CreateInstance((e, p) => e.Id = 7724)); + leftEntities[2].LeafSkipFull.Remove(leftEntities[2].LeafSkipFull.Single(e => e.Name == "Leaf 3")); + leftEntities[2].LeafSkipFull.Add( + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7724; + e.Name = "Z7724"; + })); rightEntities[2].CompositeKeySkipFull.Remove(rightEntities[2].CompositeKeySkipFull.Single(e => e.Key2 == "8_3")); rightEntities[2].CompositeKeySkipFull.Add( context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7714; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7714; e.Key2 = "7714"; e.Key3 = new DateTime(7714, 1, 1); + e.Name = "Z7714"; })); if (RequiresDetectChanges) @@ -203,8 +236,8 @@ public virtual void Can_update_many_to_many_composite_with_navs() }, context => { - var leftEntities = context.Set().Include(e => e.LeafSkipFull).OrderBy(e => e.Key1).ToList(); - var rightEntities = context.Set().Include(e => e.CompositeKeySkipFull).ToList(); + var leftEntities = context.Set().Include(e => e.LeafSkipFull).OrderBy(e => e.Key2).ToList(); + var rightEntities = context.Set().Include(e => e.CompositeKeySkipFull).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, 24, 8, 39 - 4); }); @@ -222,22 +255,22 @@ static void ValidateFixup( Assert.Equal(joinCount, context.ChangeTracker.Entries().Count()); Assert.Equal(leftCount + rightCount + joinCount, context.ChangeTracker.Entries().Count()); - Assert.Contains(leftEntities[0].LeafSkipFull, e => e.Id == 7721); - Assert.Contains(leftEntities[0].LeafSkipFull, e => e.Id == 7722); - Assert.Contains(leftEntities[0].LeafSkipFull, e => e.Id == 7723); + Assert.Contains(leftEntities[0].LeafSkipFull, e => e.Name == "Z7721"); + Assert.Contains(leftEntities[0].LeafSkipFull, e => e.Name == "Z7722"); + Assert.Contains(leftEntities[0].LeafSkipFull, e => e.Name == "Z7723"); - Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Key1 == 7711); - Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Key1 == 7712); - Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Key1 == 7713); + Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Name == "Z7711"); + Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Name == "Z7712"); + Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Name == "Z7713"); - Assert.DoesNotContain(leftEntities[0].LeafSkipFull, e => e.Id == 21); + Assert.DoesNotContain(leftEntities[0].LeafSkipFull, e => e.Name == "Leaf 1"); Assert.DoesNotContain(rightEntities[1].CompositeKeySkipFull, e => e.Key2 == "3_1"); - Assert.DoesNotContain(leftEntities[2].LeafSkipFull, e => e.Id == 23); - Assert.Contains(leftEntities[2].LeafSkipFull, e => e.Id == 7724); + Assert.DoesNotContain(leftEntities[2].LeafSkipFull, e => e.Name == "Leaf 3"); + Assert.Contains(leftEntities[2].LeafSkipFull, e => e.Name == "Z7724"); Assert.DoesNotContain(rightEntities[2].CompositeKeySkipFull, e => e.Key2 == "8_1"); - Assert.Contains(rightEntities[2].CompositeKeySkipFull, e => e.Key1 == 7714); + Assert.Contains(rightEntities[2].CompositeKeySkipFull, e => e.Key2 == "7714"); foreach (var joinEntry in context.ChangeTracker.Entries().ToList()) { @@ -252,8 +285,8 @@ static void ValidateFixup( Assert.Contains(joinEntity, joinEntity.Leaf.JoinCompositeKeyFull); } - var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Key1).ToList(); - var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Key2).ToList(); + var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var count = 0; foreach (var left in allLeft) @@ -282,19 +315,28 @@ static void ValidateFixup( [ConditionalFact] public virtual void Can_delete_with_many_to_many_composite_with_navs() { + var key1 = 0; + var key2 = ""; + var key3 = default(DateTime); + var id = 0; + ExecuteWithStrategyInTransaction( context => { var ones = context.Set().Include(e => e.RootSkipShared).OrderBy(e => e.Key2).ToList(); - var threes = context.Set().Include(e => e.CompositeKeySkipFull).ToList(); + var threes = context.Set().Include(e => e.CompositeKeySkipFull).OrderBy(e => e.Name).ToList(); // Make sure other related entities are loaded for delete fixup context.Set().Load(); - var toRemoveOne = context.Find(6, "6_1", new DateTime(2006, 1, 1)); + var toRemoveOne = context.EntityCompositeKeys.Single(e => e.Name == "Composite 6"); + key1 = toRemoveOne.Key1; + key2 = toRemoveOne.Key2; + key3 = toRemoveOne.Key3; var refCountOnes = threes.SelectMany(e => e.CompositeKeySkipFull).Count(e => e == toRemoveOne); - var toRemoveThree = context.Find(23); + var toRemoveThree = (EntityLeaf)context.EntityRoots.Single(e => e.Name == "Leaf 3"); + id = toRemoveThree.Id; var refCountThrees = ones.SelectMany(e => e.RootSkipShared).Count(e => e == toRemoveThree); foreach (var joinEntity in context.ChangeTracker.Entries().Select(e => e.Entity).ToList()) @@ -327,10 +369,10 @@ public virtual void Can_delete_with_many_to_many_composite_with_navs() Assert.All( context.ChangeTracker.Entries(), e => Assert.Equal( - (e.Entity.CompositeId1 == 6 - && e.Entity.CompositeId2 == "6_1" - && e.Entity.CompositeId3 == new DateTime(2006, 1, 1)) - || e.Entity.LeafId == 23 + (e.Entity.CompositeId1 == key1 + && e.Entity.CompositeId2 == key2 + && e.Entity.CompositeId3 == key3) + || e.Entity.LeafId == id ? EntityState.Deleted : EntityState.Unchanged, e.State)); @@ -349,44 +391,44 @@ public virtual void Can_delete_with_many_to_many_composite_with_navs() Assert.DoesNotContain( context.ChangeTracker.Entries(), - e => (e.Entity.CompositeId1 == 6 - && e.Entity.CompositeId2 == "6_1" - && e.Entity.CompositeId3 == new DateTime(2006, 1, 1)) - || e.Entity.LeafId == 23); + e => (e.Entity.CompositeId1 == key1 + && e.Entity.CompositeId2 == key2 + && e.Entity.CompositeId3 == key3) + || e.Entity.LeafId == id); }, context => { var ones = context.Set().Include(e => e.RootSkipShared).OrderBy(e => e.Key2).ToList(); - var threes = context.Set().Include(e => e.CompositeKeySkipFull).ToList(); + var threes = context.Set().Include(e => e.CompositeKeySkipFull).OrderBy(e => e.Name).ToList(); ValidateNavigations(ones, threes); Assert.DoesNotContain( context.ChangeTracker.Entries(), - e => (e.Entity.CompositeId1 == 6 - && e.Entity.CompositeId2 == "6_1" - && e.Entity.CompositeId3 == new DateTime(2006, 1, 1)) - || e.Entity.LeafId == 23); + e => (e.Entity.CompositeId1 == key1 + && e.Entity.CompositeId2 == key2 + && e.Entity.CompositeId3 == key3) + || e.Entity.LeafId == id); }); - static void ValidateNavigations(List ones, List threes) + void ValidateNavigations(List ones, List threes) { foreach (var one in ones) { if (one.RootSkipShared != null) { - Assert.DoesNotContain(one.RootSkipShared, e => e.Id == 23); + Assert.DoesNotContain(one.RootSkipShared, e => e.Id == id); } if (one.JoinLeafFull != null) { Assert.DoesNotContain( one.JoinLeafFull, - e => e.CompositeId1 == 6 - && e.CompositeId2 == "6_1" - && e.CompositeId3 == new DateTime(2006, 1, 1)); + e => e.CompositeId1 == key1 + && e.CompositeId2 == key2 + && e.CompositeId3 == key3); - Assert.DoesNotContain(one.JoinLeafFull, e => e.LeafId == 23); + Assert.DoesNotContain(one.JoinLeafFull, e => e.LeafId == id); } } @@ -396,20 +438,20 @@ static void ValidateNavigations(List ones, List { Assert.DoesNotContain( three.CompositeKeySkipFull, - e => e.Key1 == 6 - && e.Key2 == "6_1" - && e.Key3 == new DateTime(2006, 1, 1)); + e => e.Key1 == key1 + && e.Key2 == key2 + && e.Key3 == key3); } if (three.JoinCompositeKeyFull != null) { Assert.DoesNotContain( three.JoinCompositeKeyFull, - e => e.CompositeId1 == 6 - && e.CompositeId2 == "6_1" - && e.CompositeId3 == new DateTime(2006, 1, 1)); + e => e.CompositeId1 == key1 + && e.CompositeId2 == key2 + && e.CompositeId3 == key3); - Assert.DoesNotContain(three.JoinCompositeKeyFull, e => e.LeafId == 23); + Assert.DoesNotContain(three.JoinCompositeKeyFull, e => e.LeafId == id); } } } @@ -434,6 +476,8 @@ static void ValidateJoinNavigations(DbContext context) [InlineData(true)] public virtual async Task Can_insert_many_to_many_composite_shared_with_navs(bool async) { + List keys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { @@ -442,30 +486,30 @@ await ExecuteWithStrategyInTransactionAsync( context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7711; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7711; e.Key2 = "7711"; e.Key3 = new DateTime(7711, 1, 1); }), context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7712; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7712; e.Key2 = "7712"; e.Key3 = new DateTime(7712, 1, 1); }), context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7713; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7713; e.Key2 = "7713"; e.Key3 = new DateTime(7713, 1, 1); }), }; var rightEntities = new[] { - context.Set().CreateInstance((e, p) => e.Id = 7721), - context.Set().CreateInstance((e, p) => e.Id = 7722), - context.Set().CreateInstance((e, p) => e.Id = 7723) + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].RootSkipShared = CreateCollection(); @@ -503,18 +547,20 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities); + + keys = leftEntities.Select(e => e.Key1).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Key1 > 7700).Include(e => e.RootSkipShared); + var queryable = context.Set().Where(e => keys.Contains(e.Key1)).Include(e => e.RootSkipShared); var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(3, results.Count); var leftEntities = context.ChangeTracker.Entries() - .Select(e => e.Entity).OrderBy(e => e.Key1).ToList(); + .Select(e => e.Entity).OrderBy(e => e.Key2).ToList(); var rightEntities = context.ChangeTracker.Entries() - .Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + .Select(e => e.Entity).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities); }); @@ -539,54 +585,85 @@ static void ValidateFixup(DbContext context, IList leftEntit [ConditionalFact] public virtual void Can_update_many_to_many_composite_shared_with_navs() { + List rootKeys = null; + ExecuteWithStrategyInTransaction( context => { - var leftEntities = context.Set().Include(e => e.RootSkipShared).OrderBy(e => e.Key1).ToList(); - var rightEntities = context.Set().Include(e => e.CompositeKeySkipShared).ToList(); + var leftEntities = context.Set().Include(e => e.RootSkipShared).OrderBy(e => e.Key2).ToList(); + var rightEntities = context.Set().Include(e => e.CompositeKeySkipShared).OrderBy(e => e.Name).ToList(); + + var roots = new[] + { + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + }), + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + }), + context.Set().CreateInstance( + (e, p) => + { + Debug.Assert(e != null, nameof(e) + " != null"); + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + }), + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7724; + e.Name = "Z7724"; + }) + }; - leftEntities[0].RootSkipShared.Add(context.Set().CreateInstance((e, p) => e.Id = 7721)); - leftEntities[0].RootSkipShared.Add(context.Set().CreateInstance((e, p) => e.Id = 7722)); - leftEntities[0].RootSkipShared.Add(context.Set().CreateInstance((e, p) => e.Id = 7723)); + leftEntities[0].RootSkipShared.Add(roots[0]); + leftEntities[0].RootSkipShared.Add(roots[1]); + leftEntities[0].RootSkipShared.Add(roots[2]); rightEntities[0].CompositeKeySkipShared.Add( context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7711; - e.Key2 = "7711"; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7711; + e.Key2 = "Z7711"; e.Key3 = new DateTime(7711, 1, 1); })); rightEntities[0].CompositeKeySkipShared.Add( context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7712; - e.Key2 = "7712"; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7712; + e.Key2 = "Z7712"; e.Key3 = new DateTime(7712, 1, 1); })); rightEntities[0].CompositeKeySkipShared.Add( context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7713; - e.Key2 = "7713"; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7713; + e.Key2 = "Z7713"; e.Key3 = new DateTime(7713, 1, 1); })); - leftEntities[0].RootSkipShared.Remove(leftEntities[0].RootSkipShared.Single(e => e.Id == 9)); - rightEntities[1].CompositeKeySkipShared.Remove(rightEntities[1].CompositeKeySkipShared.Single(e => e.Key2 == "8_3")); + leftEntities[0].RootSkipShared.Remove(leftEntities[0].RootSkipShared.Single(e => e.Name == "Root 9")); + rightEntities[1].CompositeKeySkipShared.Remove(rightEntities[1].CompositeKeySkipShared.Single(e => e.Key2 == "8_2")); - leftEntities[2].RootSkipShared.Remove(leftEntities[2].RootSkipShared.Single(e => e.Id == 16)); - leftEntities[2].RootSkipShared.Add(context.Set().CreateInstance((e, p) => e.Id = 7724)); + leftEntities[2].RootSkipShared.Remove(leftEntities[2].RootSkipShared.Single(e => e.Name == "Branch 6")); + leftEntities[2].RootSkipShared.Add(roots[3]); - rightEntities[2].CompositeKeySkipShared.Remove(rightEntities[2].CompositeKeySkipShared.Single(e => e.Key2 == "8_2")); - rightEntities[2].CompositeKeySkipShared.Add( + rightEntities[3].CompositeKeySkipShared.Remove(rightEntities[3].CompositeKeySkipShared.Single(e => e.Key2 == "8_5")); + rightEntities[3].CompositeKeySkipShared.Add( context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7714; - e.Key2 = "7714"; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7714; + e.Key2 = "Z7714"; e.Key3 = new DateTime(7714, 1, 1); })); @@ -595,21 +672,25 @@ public virtual void Can_update_many_to_many_composite_shared_with_navs() context.ChangeTracker.DetectChanges(); } + rootKeys = roots.Select(e => context.Entry(e).Property(e => e.Id).CurrentValue).ToList(); + ValidateFixup(context, leftEntities, rightEntities, 24, 24, 47); context.SaveChanges(); + rootKeys = roots.Select(e => e.Id).ToList(); + ValidateFixup(context, leftEntities, rightEntities, 24, 24, 47 - 4); }, context => { - var leftEntities = context.Set().Include(e => e.RootSkipShared).OrderBy(e => e.Key1).ToList(); - var rightEntities = context.Set().Include(e => e.CompositeKeySkipShared).ToList(); + var leftEntities = context.Set().Include(e => e.RootSkipShared).OrderBy(e => e.Key2).ToList(); + var rightEntities = context.Set().Include(e => e.CompositeKeySkipShared).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, 24, 24, 47 - 4); }); - static void ValidateFixup( + void ValidateFixup( DbContext context, List leftEntities, List rightEntities, @@ -622,25 +703,25 @@ static void ValidateFixup( Assert.Equal(joinCount, context.ChangeTracker.Entries>().Count()); Assert.Equal(leftCount + rightCount + joinCount, context.ChangeTracker.Entries().Count()); - Assert.Contains(leftEntities[0].RootSkipShared, e => e.Id == 7721); - Assert.Contains(leftEntities[0].RootSkipShared, e => e.Id == 7722); - Assert.Contains(leftEntities[0].RootSkipShared, e => e.Id == 7723); + Assert.Contains(leftEntities[0].RootSkipShared, e => context.Entry(e).Property(e => e.Id).CurrentValue == rootKeys[0]); + Assert.Contains(leftEntities[0].RootSkipShared, e => context.Entry(e).Property(e => e.Id).CurrentValue == rootKeys[1]); + Assert.Contains(leftEntities[0].RootSkipShared, e => context.Entry(e).Property(e => e.Id).CurrentValue == rootKeys[2]); - Assert.Contains(rightEntities[0].CompositeKeySkipShared, e => e.Key1 == 7711); - Assert.Contains(rightEntities[0].CompositeKeySkipShared, e => e.Key1 == 7712); - Assert.Contains(rightEntities[0].CompositeKeySkipShared, e => e.Key1 == 7713); + Assert.Contains(rightEntities[0].CompositeKeySkipShared, e => e.Key2 == "Z7711"); + Assert.Contains(rightEntities[0].CompositeKeySkipShared, e => e.Key2 == "Z7712"); + Assert.Contains(rightEntities[0].CompositeKeySkipShared, e => e.Key2 == "Z7713"); - Assert.DoesNotContain(leftEntities[0].RootSkipShared, e => e.Id == 9); - Assert.DoesNotContain(rightEntities[1].CompositeKeySkipShared, e => e.Key2 == "8_3"); + Assert.DoesNotContain(leftEntities[0].RootSkipShared, e => e.Name == "Root 9"); + Assert.DoesNotContain(rightEntities[1].CompositeKeySkipShared, e => e.Key2 == "8_2"); - Assert.DoesNotContain(leftEntities[2].RootSkipShared, e => e.Id == 16); - Assert.Contains(leftEntities[2].RootSkipShared, e => e.Id == 7724); + Assert.DoesNotContain(leftEntities[2].RootSkipShared, e => e.Name == "Branch 6"); + Assert.Contains(leftEntities[2].RootSkipShared, e => context.Entry(e).Property(e => e.Id).CurrentValue == rootKeys[3]); - Assert.DoesNotContain(rightEntities[2].CompositeKeySkipShared, e => e.Key2 == "8_2"); - Assert.Contains(rightEntities[2].CompositeKeySkipShared, e => e.Key1 == 7714); + Assert.DoesNotContain(rightEntities[3].CompositeKeySkipShared, e => e.Key2 == "8_5"); + Assert.Contains(rightEntities[3].CompositeKeySkipShared, e => e.Key2 == "Z7714"); - var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Key1).ToList(); - var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Key2).ToList(); + var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var count = 0; foreach (var left in allLeft) @@ -669,19 +750,28 @@ static void ValidateFixup( [ConditionalFact] public virtual void Can_delete_with_many_to_many_composite_shared_with_navs() { + var key1 = 0; + var key2 = ""; + var key3 = default(DateTime); + var id = 0; + ExecuteWithStrategyInTransaction( context => { var ones = context.Set().Include(e => e.RootSkipShared).OrderBy(e => e.Key2).ToList(); - var threes = context.Set().Include(e => e.CompositeKeySkipShared).ToList(); + var threes = context.Set().Include(e => e.CompositeKeySkipShared).OrderBy(e => e.Name).ToList(); // Make sure other related entities are loaded for delete fixup context.Set().Load(); - var toRemoveOne = context.Find(6, "6_1", new DateTime(2006, 1, 1)); + var toRemoveOne = context.EntityCompositeKeys.Single(e => e.Name == "Composite 6"); + key1 = toRemoveOne.Key1; + key2 = toRemoveOne.Key2; + key3 = toRemoveOne.Key3; var refCountOnes = threes.SelectMany(e => e.CompositeKeySkipShared).Count(e => e == toRemoveOne); - var toRemoveThree = context.Find(23); + var toRemoveThree = context.EntityRoots.Single(e => e.Name == "Leaf 3"); + id = toRemoveThree.Id; var refCountThrees = ones.SelectMany(e => e.RootSkipShared).Count(e => e == toRemoveThree); context.Remove(toRemoveOne); @@ -700,10 +790,10 @@ public virtual void Can_delete_with_many_to_many_composite_shared_with_navs() Assert.All( context.ChangeTracker.Entries>(), e => Assert.Equal( - ((int)e.Entity["CompositeId1"] == 6 - && (string)e.Entity["CompositeId2"] == "6_1" - && (DateTime)e.Entity["CompositeId3"] == new DateTime(2006, 1, 1)) - || (int)e.Entity["RootId"] == 23 + ((int)e.Entity["CompositeId1"] == key1 + && (string)e.Entity["CompositeId2"] == key2 + && (DateTime)e.Entity["CompositeId3"] == key3) + || (int)e.Entity["RootId"] == id ? EntityState.Deleted : EntityState.Unchanged, e.State)); @@ -720,33 +810,35 @@ public virtual void Can_delete_with_many_to_many_composite_shared_with_navs() Assert.DoesNotContain( context.ChangeTracker.Entries>(), - e => ((int)e.Entity["CompositeId1"] == 6 - && (string)e.Entity["CompositeId2"] == "6_1" - && (DateTime)e.Entity["CompositeId3"] == new DateTime(2006, 1, 1)) - || (int)e.Entity["RootId"] == 23); + e => ((int)e.Entity["CompositeId1"] == key1 + && (string)e.Entity["CompositeId2"] == key2 + && (DateTime)e.Entity["CompositeId3"] == key3) + || (int)e.Entity["RootId"] == id); }, context => { var ones = context.Set().Include(e => e.RootSkipShared).OrderBy(e => e.Key2).ToList(); - var threes = context.Set().Include(e => e.CompositeKeySkipShared).ToList(); + var threes = context.Set().Include(e => e.CompositeKeySkipShared).OrderBy(e => e.Name).ToList(); ValidateNavigations(ones, threes); Assert.DoesNotContain( context.ChangeTracker.Entries>(), - e => ((int)e.Entity["CompositeId1"] == 6 - && (string)e.Entity["CompositeId2"] == "6_1" - && (DateTime)e.Entity["CompositeId3"] == new DateTime(2006, 1, 1)) - || (int)e.Entity["RootId"] == 23); + e => ((int)e.Entity["CompositeId1"] == key1 + && (string)e.Entity["CompositeId2"] == key2 + && (DateTime)e.Entity["CompositeId3"] == key3) + || (int)e.Entity["RootId"] == id); }); - static void ValidateNavigations(List ones, List threes) + void ValidateNavigations( + List ones, + List threes) { foreach (var one in ones) { if (one.RootSkipShared != null) { - Assert.DoesNotContain(one.RootSkipShared, e => e.Id == 23); + Assert.DoesNotContain(one.RootSkipShared, e => e.Id == id); } } @@ -756,9 +848,9 @@ static void ValidateNavigations(List ones, List { Assert.DoesNotContain( three.CompositeKeySkipShared, - e => e.Key1 == 6 - && e.Key2 == "6_1" - && e.Key3 == new DateTime(2006, 1, 1)); + e => e.Key1 == key1 + && e.Key2 == key2 + && e.Key3 == key3); } } } @@ -769,6 +861,8 @@ static void ValidateNavigations(List ones, List [InlineData(true)] public virtual async Task Can_insert_many_to_many_composite_additional_pk_with_navs(bool async) { + List keys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { @@ -777,30 +871,45 @@ await ExecuteWithStrategyInTransactionAsync( context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7711; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7711; e.Key2 = "7711"; e.Key3 = new DateTime(7711, 1, 1); }), context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7712; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7712; e.Key2 = "7712"; e.Key3 = new DateTime(7712, 1, 1); }), context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7713; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7713; e.Key2 = "7713"; e.Key3 = new DateTime(7713, 1, 1); }), }; var rightEntities = new[] { - context.Set().CreateInstance((e, p) => e.Id = 7721), - context.Set().CreateInstance((e, p) => e.Id = 7722), - context.Set().CreateInstance((e, p) => e.Id = 7723) + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + }), + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + }), + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + }) }; leftEntities[0].ThreeSkipFull = CreateCollection(); @@ -838,18 +947,20 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities); + + keys = leftEntities.Select(e => e.Key2).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Key1 > 7700).Include(e => e.ThreeSkipFull); + var queryable = context.Set().Where(e => keys.Contains(e.Key2)).Include(e => e.ThreeSkipFull); var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(3, results.Count); var leftEntities = context.ChangeTracker.Entries() - .Select(e => e.Entity).OrderBy(e => e.Key1).ToList(); + .Select(e => e.Entity).OrderBy(e => e.Key2).ToList(); var rightEntities = context.ChangeTracker.Entries() - .Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + .Select(e => e.Entity).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities); }); @@ -886,77 +997,117 @@ static void ValidateFixup(DbContext context, IList leftEntit [ConditionalFact] public virtual void Can_update_many_to_many_composite_additional_pk_with_navs() { + List threeIds = null; + ExecuteWithStrategyInTransaction( context => { - var leftEntities = context.Set().Include(e => e.ThreeSkipFull).OrderBy(e => e.Key1).ToList(); - var rightEntities = context.Set().Include(e => e.CompositeKeySkipFull).ToList(); + var leftEntities = context.Set().Include(e => e.ThreeSkipFull).OrderBy(e => e.Key2).ToList(); + var rightEntities = context.Set().Include(e => e.CompositeKeySkipFull).OrderBy(e => e.Name).ToList(); - leftEntities[0].ThreeSkipFull.Add(context.Set().CreateInstance((e, p) => e.Id = 7721)); - leftEntities[0].ThreeSkipFull.Add(context.Set().CreateInstance((e, p) => e.Id = 7722)); - leftEntities[0].ThreeSkipFull.Add(context.Set().CreateInstance((e, p) => e.Id = 7723)); + var threes = new[] + { + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + }), + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + }), + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + }), + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7724; + e.Name = "Z7724"; + }) + }; - rightEntities[0].CompositeKeySkipFull.Add( + var composites = new[] + { context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7711; - e.Key2 = "7711"; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7711; + e.Key2 = "Z7711"; e.Key3 = new DateTime(7711, 1, 1); - })); - rightEntities[0].CompositeKeySkipFull.Add( + }), context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7712; - e.Key2 = "7712"; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7712; + e.Key2 = "Z7712"; e.Key3 = new DateTime(7712, 1, 1); - })); - rightEntities[0].CompositeKeySkipFull.Add( + }), context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7713; - e.Key2 = "7713"; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7713; + e.Key2 = "Z7713"; e.Key3 = new DateTime(7713, 1, 1); - })); - - leftEntities[0].ThreeSkipFull.Remove(leftEntities[0].ThreeSkipFull.Single(e => e.Id == 2)); - rightEntities[1].CompositeKeySkipFull.Remove(rightEntities[1].CompositeKeySkipFull.Single(e => e.Key2 == "9_2")); - - leftEntities[3].ThreeSkipFull.Remove(leftEntities[3].ThreeSkipFull.Single(e => e.Id == 7)); - leftEntities[3].ThreeSkipFull.Add(context.Set().CreateInstance((e, p) => e.Id = 7724)); - - rightEntities[2].CompositeKeySkipFull.Remove(rightEntities[2].CompositeKeySkipFull.Single(e => e.Key2 == "6_1")); - rightEntities[2].CompositeKeySkipFull.Add( + }), context.EntityCompositeKeys.CreateInstance( (e, p) => { - e.Key1 = 7714; - e.Key2 = "7714"; + e.Key1 = Fixture.UseGeneratedKeys ? 0 : 7714; + e.Key2 = "Z7714"; e.Key3 = new DateTime(7714, 1, 1); - })); + }) + }; + + leftEntities[0].ThreeSkipFull.Add(threes[0]); + leftEntities[0].ThreeSkipFull.Add(threes[1]); + leftEntities[0].ThreeSkipFull.Add(threes[2]); + + rightEntities[0].CompositeKeySkipFull.Add(composites[0]); + rightEntities[0].CompositeKeySkipFull.Add(composites[1]); + rightEntities[0].CompositeKeySkipFull.Add(composites[2]); + + leftEntities[0].ThreeSkipFull.Remove(leftEntities[0].ThreeSkipFull.Single(e => e.Name == "EntityThree 2")); + rightEntities[1].CompositeKeySkipFull + .Remove(rightEntities[1].CompositeKeySkipFull.Single(e => e.Name == "Composite 16")); + + leftEntities[3].ThreeSkipFull.Remove(leftEntities[3].ThreeSkipFull.Single(e => e.Name == "EntityThree 7")); + leftEntities[3].ThreeSkipFull.Add(threes[3]); + + rightEntities[2].CompositeKeySkipFull + .Remove(rightEntities[2].CompositeKeySkipFull.Single(e => e.Name == "Composite 7")); + rightEntities[2].CompositeKeySkipFull.Add(composites[3]); if (RequiresDetectChanges) { context.ChangeTracker.DetectChanges(); } + threeIds = threes.Select(e => context.Entry(e).Property(e => e.Id).CurrentValue).ToList(); + ValidateFixup(context, leftEntities, rightEntities, 24, 24, 53); context.SaveChanges(); + threeIds = threes.Select(e => e.Id).ToList(); + ValidateFixup(context, leftEntities, rightEntities, 24, 24, 53 - 4); }, context => { - var leftEntities = context.Set().Include(e => e.ThreeSkipFull).OrderBy(e => e.Key1).ToList(); - var rightEntities = context.Set().Include(e => e.CompositeKeySkipFull).ToList(); + var leftEntities = context.Set().Include(e => e.ThreeSkipFull).OrderBy(e => e.Key2).ToList(); + var rightEntities = context.Set().Include(e => e.CompositeKeySkipFull).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, 24, 24, 53 - 4); }); - static void ValidateFixup( + void ValidateFixup( DbContext context, List leftEntities, List rightEntities, @@ -969,22 +1120,22 @@ static void ValidateFixup( Assert.Equal(joinCount, context.ChangeTracker.Entries().Count()); Assert.Equal(leftCount + rightCount + joinCount, context.ChangeTracker.Entries().Count()); - Assert.Contains(leftEntities[0].ThreeSkipFull, e => e.Id == 7721); - Assert.Contains(leftEntities[0].ThreeSkipFull, e => e.Id == 7722); - Assert.Contains(leftEntities[0].ThreeSkipFull, e => e.Id == 7723); + Assert.Contains(leftEntities[0].ThreeSkipFull, e => context.Entry(e).Property(e => e.Id).CurrentValue == threeIds[0]); + Assert.Contains(leftEntities[0].ThreeSkipFull, e => context.Entry(e).Property(e => e.Id).CurrentValue == threeIds[1]); + Assert.Contains(leftEntities[0].ThreeSkipFull, e => context.Entry(e).Property(e => e.Id).CurrentValue == threeIds[2]); - Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Key1 == 7711); - Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Key1 == 7712); - Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Key1 == 7713); + Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Key2 == "Z7711"); + Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Key2 == "Z7712"); + Assert.Contains(rightEntities[0].CompositeKeySkipFull, e => e.Key2 == "Z7713"); - Assert.DoesNotContain(leftEntities[0].ThreeSkipFull, e => e.Id == 2); + Assert.DoesNotContain(leftEntities[0].ThreeSkipFull, e => e.Name == "EntityThree 9"); Assert.DoesNotContain(rightEntities[1].CompositeKeySkipFull, e => e.Key2 == "9_2"); - Assert.DoesNotContain(leftEntities[3].ThreeSkipFull, e => e.Id == 23); - Assert.Contains(leftEntities[3].ThreeSkipFull, e => e.Id == 7724); + Assert.DoesNotContain(leftEntities[3].ThreeSkipFull, e => e.Name == "EntityThree 23"); + Assert.Contains(leftEntities[3].ThreeSkipFull, e => context.Entry(e).Property(e => e.Id).CurrentValue == threeIds[3]); Assert.DoesNotContain(rightEntities[2].CompositeKeySkipFull, e => e.Key2 == "6_1"); - Assert.Contains(rightEntities[2].CompositeKeySkipFull, e => e.Key1 == 7714); + Assert.Contains(rightEntities[2].CompositeKeySkipFull, e => e.Key2 == "Z7714"); foreach (var joinEntry in context.ChangeTracker.Entries().ToList()) { @@ -999,8 +1150,8 @@ static void ValidateFixup( Assert.Contains(joinEntity, joinEntity.Three.JoinCompositeKeyFull); } - var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Key1).ToList(); - var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Key2).ToList(); + var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var count = 0; foreach (var left in allLeft) @@ -1029,19 +1180,22 @@ static void ValidateFixup( [ConditionalFact] public virtual void Can_delete_with_many_to_many_composite_additional_pk_with_navs() { + var threeId = 0; + ExecuteWithStrategyInTransaction( context => { var ones = context.Set().Include(e => e.ThreeSkipFull).OrderBy(e => e.Key2).ToList(); - var threes = context.Set().Include(e => e.CompositeKeySkipFull).ToList(); + var threes = context.Set().Include(e => e.CompositeKeySkipFull).OrderBy(e => e.Name).ToList(); // Make sure other related entities are loaded for delete fixup context.Set().Load(); - var toRemoveOne = context.Find(6, "6_1", new DateTime(2006, 1, 1)); + var toRemoveOne = context.EntityCompositeKeys.Single(e => e.Name == "Composite 6"); var refCountOnes = threes.SelectMany(e => e.CompositeKeySkipFull).Count(e => e == toRemoveOne); - var toRemoveThree = context.Find(17); + var toRemoveThree = context.EntityThrees.Single(e => e.Name == "EntityThree 17"); + threeId = toRemoveThree.Id; var refCountThrees = ones.SelectMany(e => e.ThreeSkipFull).Count(e => e == toRemoveThree); foreach (var joinEntity in context.ChangeTracker.Entries().Select(e => e.Entity).ToList()) @@ -1074,10 +1228,9 @@ public virtual void Can_delete_with_many_to_many_composite_additional_pk_with_na Assert.All( context.ChangeTracker.Entries(), e => Assert.Equal( - (e.Entity.CompositeId1 == 6 - && e.Entity.CompositeId2 == "6_1" + (e.Entity.CompositeId2 == "6_1" && e.Entity.CompositeId3 == new DateTime(2006, 1, 1)) - || e.Entity.ThreeId == 17 + || e.Entity.ThreeId == threeId ? EntityState.Deleted : EntityState.Unchanged, e.State)); @@ -1096,44 +1249,41 @@ public virtual void Can_delete_with_many_to_many_composite_additional_pk_with_na Assert.DoesNotContain( context.ChangeTracker.Entries(), - e => (e.Entity.CompositeId1 == 6 - && e.Entity.CompositeId2 == "6_1" + e => (e.Entity.CompositeId2 == "6_1" && e.Entity.CompositeId3 == new DateTime(2006, 1, 1)) - || e.Entity.ThreeId == 17); + || e.Entity.ThreeId == threeId); }, context => { var ones = context.Set().Include(e => e.ThreeSkipFull).OrderBy(e => e.Key2).ToList(); - var threes = context.Set().Include(e => e.CompositeKeySkipFull).ToList(); + var threes = context.Set().Include(e => e.CompositeKeySkipFull).OrderBy(e => e.Name).ToList(); ValidateNavigations(ones, threes); Assert.DoesNotContain( context.ChangeTracker.Entries(), - e => (e.Entity.CompositeId1 == 6 - && e.Entity.CompositeId2 == "6_1" + e => (e.Entity.CompositeId2 == "6_1" && e.Entity.CompositeId3 == new DateTime(2006, 1, 1)) - || e.Entity.ThreeId == 17); + || e.Entity.ThreeId == threeId); }); - static void ValidateNavigations(List ones, List threes) + void ValidateNavigations(List ones, List threes) { foreach (var one in ones) { if (one.ThreeSkipFull != null) { - Assert.DoesNotContain(one.ThreeSkipFull, e => e.Id == 17); + Assert.DoesNotContain(one.ThreeSkipFull, e => e.Id == threeId); } if (one.JoinThreeFull != null) { Assert.DoesNotContain( one.JoinThreeFull, - e => e.CompositeId1 == 6 - && e.CompositeId2 == "6_1" + e => e.CompositeId2 == "6_1" && e.CompositeId3 == new DateTime(2006, 1, 1)); - Assert.DoesNotContain(one.JoinThreeFull, e => e.ThreeId == 17); + Assert.DoesNotContain(one.JoinThreeFull, e => e.ThreeId == threeId); } } @@ -1143,8 +1293,7 @@ static void ValidateNavigations(List ones, List { Assert.DoesNotContain( three.CompositeKeySkipFull, - e => e.Key1 == 6 - && e.Key2 == "6_1" + e => e.Key2 == "6_1" && e.Key3 == new DateTime(2006, 1, 1)); } @@ -1152,11 +1301,10 @@ static void ValidateNavigations(List ones, List { Assert.DoesNotContain( three.JoinCompositeKeyFull, - e => e.CompositeId1 == 6 - && e.CompositeId2 == "6_1" + e => e.CompositeId2 == "6_1" && e.CompositeId3 == new DateTime(2006, 1, 1)); - Assert.DoesNotContain(three.JoinCompositeKeyFull, e => e.ThreeId == 17); + Assert.DoesNotContain(three.JoinCompositeKeyFull, e => e.ThreeId == threeId); } } } @@ -1181,20 +1329,23 @@ static void ValidateJoinNavigations(DbContext context) [InlineData(true)] public virtual async Task Can_insert_many_to_many_self_shared(bool async) { + List leftKeys = null; + List rightKeys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { var leftEntities = new[] { - context.EntityTwos.CreateInstance((e, p) => e.Id = 7711), - context.EntityTwos.CreateInstance((e, p) => e.Id = 7712), - context.EntityTwos.CreateInstance((e, p) => e.Id = 7713) + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7711), + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7712), + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7713) }; var rightEntities = new[] { - context.EntityTwos.CreateInstance((e, p) => e.Id = 7721), - context.EntityTwos.CreateInstance((e, p) => e.Id = 7722), - context.EntityTwos.CreateInstance((e, p) => e.Id = 7723) + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].SelfSkipSharedLeft = CreateCollection(); @@ -1232,23 +1383,29 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities); + + leftKeys = leftEntities.Select(e => e.Id).ToList(); + rightKeys = rightEntities.Select(e => e.Id).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Id > 7700).Include(e => e.SelfSkipSharedLeft); + var queryable = context.Set() + .Where(e => leftKeys.Contains(e.Id) || rightKeys.Contains(e.Id)) + .Include(e => e.SelfSkipSharedLeft); + var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(6, results.Count); var leftEntities = context.ChangeTracker.Entries() .Select(e => e.Entity) - .Where(e => e.Id < 7720) - .OrderBy(e => e.Id) + .Where(e => leftKeys.Contains(e.Id)) + .OrderBy(e => e.Name) .ToList(); var rightEntities = context.ChangeTracker.Entries() .Select(e => e.Entity) - .Where(e => e.Id > 7720) - .OrderBy(e => e.Id) + .Where(e => rightKeys.Contains(e.Id)) + .OrderBy(e => e.Name) .ToList(); ValidateFixup(context, leftEntities, rightEntities); @@ -1273,49 +1430,107 @@ static void ValidateFixup(DbContext context, IList leftEntities, ILis [ConditionalFact] public virtual void Can_update_many_to_many_self() { + List ids = null; + ExecuteWithStrategyInTransaction( context => { - var leftEntities = context.Set().Include(e => e.SelfSkipSharedRight).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.SelfSkipSharedLeft).ToList(); + var leftEntities = context.Set().Include(e => e.SelfSkipSharedRight).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.SelfSkipSharedLeft).OrderBy(e => e.Name).ToList(); + + var twos = new[] + { + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7724; + e.Name = "Z7724"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7711; + e.Name = "Z7711"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7712; + e.Name = "Z7712"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7713; + e.Name = "Z7713"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7714; + e.Name = "Z7714"; + }) + }; - leftEntities[0].SelfSkipSharedRight.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7721)); - leftEntities[0].SelfSkipSharedRight.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7722)); - leftEntities[0].SelfSkipSharedRight.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7723)); + leftEntities[0].SelfSkipSharedRight.Add(twos[0]); + leftEntities[0].SelfSkipSharedRight.Add(twos[1]); + leftEntities[0].SelfSkipSharedRight.Add(twos[2]); - rightEntities[0].SelfSkipSharedLeft.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7711)); - rightEntities[0].SelfSkipSharedLeft.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7712)); - rightEntities[0].SelfSkipSharedLeft.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7713)); + rightEntities[0].SelfSkipSharedLeft.Add(twos[4]); + rightEntities[0].SelfSkipSharedLeft.Add(twos[5]); + rightEntities[0].SelfSkipSharedLeft.Add(twos[6]); - leftEntities[2].SelfSkipSharedRight.Remove(leftEntities[2].SelfSkipSharedRight.Single(e => e.Id == 5)); - rightEntities[1].SelfSkipSharedLeft.Remove(rightEntities[1].SelfSkipSharedLeft.Single(e => e.Id == 8)); + leftEntities[0].SelfSkipSharedRight.Remove(leftEntities[0].SelfSkipSharedRight.Single(e => e.Name == "EntityTwo 9")); + rightEntities[1].SelfSkipSharedLeft.Remove(rightEntities[1].SelfSkipSharedLeft.Single(e => e.Name == "EntityTwo 1")); - leftEntities[4].SelfSkipSharedRight.Remove(leftEntities[4].SelfSkipSharedRight.Single(e => e.Id == 8)); - leftEntities[4].SelfSkipSharedRight.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7724)); + leftEntities[4].SelfSkipSharedRight.Remove(leftEntities[4].SelfSkipSharedRight.Single(e => e.Name == "EntityTwo 18")); + leftEntities[4].SelfSkipSharedRight.Add(twos[3]); - rightEntities[3].SelfSkipSharedLeft.Remove(rightEntities[3].SelfSkipSharedLeft.Single(e => e.Id == 9)); - rightEntities[3].SelfSkipSharedLeft.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7714)); + rightEntities[5].SelfSkipSharedLeft.Remove(rightEntities[5].SelfSkipSharedLeft.Single(e => e.Name == "EntityTwo 12")); + rightEntities[5].SelfSkipSharedLeft.Add(twos[7]); if (RequiresDetectChanges) { context.ChangeTracker.DetectChanges(); } + ids = twos.Select(e => context.Entry(e).Property(e => e.Id).CurrentValue).ToList(); + ValidateFixup(context, leftEntities, rightEntities, 28, 42); context.SaveChanges(); + ids = twos.Select(e => e.Id).ToList(); + ValidateFixup(context, leftEntities, rightEntities, 28, 42 - 4); }, context => { - var leftEntities = context.Set().Include(e => e.SelfSkipSharedRight).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.SelfSkipSharedLeft).ToList(); + var leftEntities = context.Set().Include(e => e.SelfSkipSharedRight).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.SelfSkipSharedLeft).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, 28, 42 - 4); }); - static void ValidateFixup( + void ValidateFixup( DbContext context, List leftEntities, List rightEntities, @@ -1326,25 +1541,25 @@ static void ValidateFixup( Assert.Equal(joinCount, context.ChangeTracker.Entries>().Count()); Assert.Equal(count + joinCount, context.ChangeTracker.Entries().Count()); - Assert.Contains(leftEntities[0].SelfSkipSharedRight, e => e.Id == 7721); - Assert.Contains(leftEntities[0].SelfSkipSharedRight, e => e.Id == 7722); - Assert.Contains(leftEntities[0].SelfSkipSharedRight, e => e.Id == 7723); + Assert.Contains(leftEntities[0].SelfSkipSharedRight, e => context.Entry(e).Property(e => e.Id).CurrentValue == ids[0]); + Assert.Contains(leftEntities[0].SelfSkipSharedRight, e => context.Entry(e).Property(e => e.Id).CurrentValue == ids[1]); + Assert.Contains(leftEntities[0].SelfSkipSharedRight, e => context.Entry(e).Property(e => e.Id).CurrentValue == ids[2]); - Assert.Contains(rightEntities[0].SelfSkipSharedLeft, e => e.Id == 7711); - Assert.Contains(rightEntities[0].SelfSkipSharedLeft, e => e.Id == 7712); - Assert.Contains(rightEntities[0].SelfSkipSharedLeft, e => e.Id == 7713); + Assert.Contains(rightEntities[0].SelfSkipSharedLeft, e => context.Entry(e).Property(e => e.Id).CurrentValue == ids[4]); + Assert.Contains(rightEntities[0].SelfSkipSharedLeft, e => context.Entry(e).Property(e => e.Id).CurrentValue == ids[5]); + Assert.Contains(rightEntities[0].SelfSkipSharedLeft, e => context.Entry(e).Property(e => e.Id).CurrentValue == ids[6]); - Assert.DoesNotContain(leftEntities[2].SelfSkipSharedRight, e => e.Id == 5); - Assert.DoesNotContain(rightEntities[1].SelfSkipSharedLeft, e => e.Id == 8); + Assert.DoesNotContain(leftEntities[0].SelfSkipSharedRight, e => e.Name == "EntityTwo 9"); + Assert.DoesNotContain(rightEntities[1].SelfSkipSharedLeft, e => e.Name == "EntityTwo 1"); - Assert.DoesNotContain(leftEntities[4].SelfSkipSharedRight, e => e.Id == 8); - Assert.Contains(leftEntities[4].SelfSkipSharedRight, e => e.Id == 7724); + Assert.DoesNotContain(leftEntities[4].SelfSkipSharedRight, e => e.Name == "EntityTwo 18"); + Assert.Contains(leftEntities[4].SelfSkipSharedRight, e => context.Entry(e).Property(e => e.Id).CurrentValue == ids[3]); - Assert.DoesNotContain(rightEntities[3].SelfSkipSharedLeft, e => e.Id == 9); - Assert.Contains(rightEntities[3].SelfSkipSharedLeft, e => e.Id == 7714); + Assert.DoesNotContain(rightEntities[5].SelfSkipSharedLeft, e => e.Name == "EntityTwo 12"); + Assert.Contains(rightEntities[5].SelfSkipSharedLeft, e => context.Entry(e).Property(e => e.Id).CurrentValue == ids[7]); - var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var joins = 0; foreach (var left in allLeft) @@ -1375,20 +1590,22 @@ static void ValidateFixup( [InlineData(true)] public virtual async Task Can_insert_many_to_many_with_navs(bool async) { + List keys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { var leftEntities = new[] { - context.EntityTwos.CreateInstance((e, p) => e.Id = 7711), - context.EntityTwos.CreateInstance((e, p) => e.Id = 7712), - context.EntityTwos.CreateInstance((e, p) => e.Id = 7713) + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7711), + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7712), + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7713) }; var rightEntities = new[] { - context.EntityThrees.CreateInstance((e, p) => e.Id = 7721), - context.EntityThrees.CreateInstance((e, p) => e.Id = 7722), - context.EntityThrees.CreateInstance((e, p) => e.Id = 7723) + context.EntityThrees.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.EntityThrees.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.EntityThrees.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].ThreeSkipFull = CreateCollection(); @@ -1426,15 +1643,17 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities); + + keys = leftEntities.Select(e => e.Id).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Id > 7700).Include(e => e.ThreeSkipFull); + var queryable = context.Set().Where(e => keys.Contains(e.Id)).Include(e => e.ThreeSkipFull); var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(3, results.Count); - var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities); }); @@ -1470,25 +1689,73 @@ public virtual void Can_update_many_to_many_with_navs() ExecuteWithStrategyInTransaction( context => { - var leftEntities = context.Set().Include(e => e.ThreeSkipFull).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.TwoSkipFull).ToList(); + var leftEntities = context.Set().Include(e => e.ThreeSkipFull).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.TwoSkipFull).OrderBy(e => e.Name).ToList(); - leftEntities[0].ThreeSkipFull.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7721)); - leftEntities[0].ThreeSkipFull.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7722)); - leftEntities[0].ThreeSkipFull.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7723)); + leftEntities[0].ThreeSkipFull.Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + })); + leftEntities[0].ThreeSkipFull.Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + })); + leftEntities[0].ThreeSkipFull.Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + })); - rightEntities[0].TwoSkipFull.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7711)); - rightEntities[0].TwoSkipFull.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7712)); - rightEntities[0].TwoSkipFull.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7713)); + rightEntities[0].TwoSkipFull.Add( + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7711; + e.Name = "Z7711"; + })); + rightEntities[0].TwoSkipFull.Add( + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7712; + e.Name = "Z7712"; + })); + rightEntities[0].TwoSkipFull.Add( + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7713; + e.Name = "Z7713"; + })); - leftEntities[1].ThreeSkipFull.Remove(leftEntities[1].ThreeSkipFull.Single(e => e.Id == 9)); - rightEntities[1].TwoSkipFull.Remove(rightEntities[1].TwoSkipFull.Single(e => e.Id == 4)); + leftEntities[1].ThreeSkipFull.Remove(leftEntities[1].ThreeSkipFull.Single(e => e.Name == "EntityThree 17")); + rightEntities[1].TwoSkipFull.Remove(rightEntities[1].TwoSkipFull.Single(e => e.Name == "EntityTwo 6")); - leftEntities[2].ThreeSkipFull.Remove(leftEntities[2].ThreeSkipFull.Single(e => e.Id == 11)); - leftEntities[2].ThreeSkipFull.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7724)); + leftEntities[2].ThreeSkipFull.Remove(leftEntities[2].ThreeSkipFull.Single(e => e.Name == "EntityThree 13")); + leftEntities[2].ThreeSkipFull.Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7724; + e.Name = "Z7724"; + })); - rightEntities[2].TwoSkipFull.Remove(rightEntities[2].TwoSkipFull.Single(e => e.Id == 6)); - rightEntities[2].TwoSkipFull.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7714)); + rightEntities[2].TwoSkipFull.Remove(rightEntities[2].TwoSkipFull.Single(e => e.Name == "EntityTwo 3")); + rightEntities[2].TwoSkipFull.Add( + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7714; + e.Name = "Z7714"; + })); if (RequiresDetectChanges) { @@ -1503,8 +1770,8 @@ public virtual void Can_update_many_to_many_with_navs() }, context => { - var leftEntities = context.Set().Include(e => e.ThreeSkipFull).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.TwoSkipFull).ToList(); + var leftEntities = context.Set().Include(e => e.ThreeSkipFull).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.TwoSkipFull).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, 24, 24, 60 - 4); }); @@ -1522,22 +1789,22 @@ static void ValidateFixup( Assert.Equal(joinCount, context.ChangeTracker.Entries().Count()); Assert.Equal(leftCount + rightCount + joinCount, context.ChangeTracker.Entries().Count()); - Assert.Contains(leftEntities[0].ThreeSkipFull, e => e.Id == 7721); - Assert.Contains(leftEntities[0].ThreeSkipFull, e => e.Id == 7722); - Assert.Contains(leftEntities[0].ThreeSkipFull, e => e.Id == 7723); + Assert.Contains(leftEntities[0].ThreeSkipFull, e => e.Name == "Z7721"); + Assert.Contains(leftEntities[0].ThreeSkipFull, e => e.Name == "Z7722"); + Assert.Contains(leftEntities[0].ThreeSkipFull, e => e.Name == "Z7723"); - Assert.Contains(rightEntities[0].TwoSkipFull, e => e.Id == 7711); - Assert.Contains(rightEntities[0].TwoSkipFull, e => e.Id == 7712); - Assert.Contains(rightEntities[0].TwoSkipFull, e => e.Id == 7713); + Assert.Contains(rightEntities[0].TwoSkipFull, e => e.Name == "Z7711"); + Assert.Contains(rightEntities[0].TwoSkipFull, e => e.Name == "Z7712"); + Assert.Contains(rightEntities[0].TwoSkipFull, e => e.Name == "Z7713"); - Assert.DoesNotContain(leftEntities[1].ThreeSkipFull, e => e.Id == 9); - Assert.DoesNotContain(rightEntities[1].TwoSkipFull, e => e.Id == 4); + Assert.DoesNotContain(leftEntities[1].ThreeSkipFull, e => e.Name == "EntityThree 17"); + Assert.DoesNotContain(rightEntities[1].TwoSkipFull, e => e.Name == "EntityTwo 6"); - Assert.DoesNotContain(leftEntities[2].ThreeSkipFull, e => e.Id == 11); - Assert.Contains(leftEntities[2].ThreeSkipFull, e => e.Id == 7724); + Assert.DoesNotContain(leftEntities[2].ThreeSkipFull, e => e.Name == "EntityThree 13"); + Assert.Contains(leftEntities[2].ThreeSkipFull, e => e.Name == "Z7724"); - Assert.DoesNotContain(rightEntities[2].TwoSkipFull, e => e.Id == 6); - Assert.Contains(rightEntities[2].TwoSkipFull, e => e.Id == 7714); + Assert.DoesNotContain(rightEntities[2].TwoSkipFull, e => e.Name == "EntityTwo 3"); + Assert.Contains(rightEntities[2].TwoSkipFull, e => e.Name == "Z7714"); foreach (var joinEntry in context.ChangeTracker.Entries().ToList()) { @@ -1548,8 +1815,8 @@ static void ValidateFixup( Assert.Contains(joinEntity, joinEntity.Three.JoinTwoFull); } - var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var count = 0; foreach (var left in allLeft) @@ -1580,20 +1847,22 @@ static void ValidateFixup( [InlineData(true)] public virtual async Task Can_insert_many_to_many_with_inheritance(bool async) { + List keys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { var leftEntities = new[] { - context.EntityOnes.CreateInstance((e, p) => e.Id = 7711), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7712), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7713), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7711), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7712), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7713), }; var rightEntities = new[] { - context.Set().CreateInstance((e, p) => e.Id = 7721), - context.Set().CreateInstance((e, p) => e.Id = 7722), - context.Set().CreateInstance((e, p) => e.Id = 7723) + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].BranchSkip = CreateCollection(); @@ -1631,15 +1900,17 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities); + + keys = leftEntities.Select(e => e.Id).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Id > 7700).Include(e => e.BranchSkip); + var queryable = context.Set().Where(e => keys.Contains(e.Id)).Include(e => e.BranchSkip); var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(3, results.Count); - var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities); }); @@ -1667,25 +1938,73 @@ public virtual void Can_update_many_to_many_with_inheritance() ExecuteWithStrategyInTransaction( context => { - var leftEntities = context.Set().Include(e => e.BranchSkip).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.OneSkip).ToList(); + var leftEntities = context.Set().Include(e => e.BranchSkip).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.OneSkip).OrderBy(e => e.Name).ToList(); - leftEntities[0].BranchSkip.Add(context.Set().CreateInstance((e, p) => e.Id = 7721)); - leftEntities[0].BranchSkip.Add(context.Set().CreateInstance((e, p) => e.Id = 7722)); - leftEntities[0].BranchSkip.Add(context.Set().CreateInstance((e, p) => e.Id = 7723)); + leftEntities[0].BranchSkip.Add( + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + })); + leftEntities[0].BranchSkip.Add( + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + })); + leftEntities[0].BranchSkip.Add( + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + })); - rightEntities[0].OneSkip.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7711)); - rightEntities[0].OneSkip.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7712)); - rightEntities[0].OneSkip.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7713)); + rightEntities[0].OneSkip.Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7711; + e.Name = "Z7711"; + })); + rightEntities[0].OneSkip.Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7712; + e.Name = "Z7712"; + })); + rightEntities[0].OneSkip.Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7713; + e.Name = "Z7713"; + })); - leftEntities[1].BranchSkip.Remove(leftEntities[1].BranchSkip.Single(e => e.Id == 16)); - rightEntities[1].OneSkip.Remove(rightEntities[1].OneSkip.Single(e => e.Id == 9)); + leftEntities[1].BranchSkip.Remove(leftEntities[1].BranchSkip.Single(e => e.Name == "Branch 4")); + rightEntities[1].OneSkip.Remove(rightEntities[1].OneSkip.Single(e => e.Name == "EntityOne 9")); - leftEntities[2].BranchSkip.Remove(leftEntities[2].BranchSkip.Single(e => e.Id == 14)); - leftEntities[2].BranchSkip.Add(context.Set().CreateInstance((e, p) => e.Id = 7724)); + leftEntities[4].BranchSkip.Remove(leftEntities[4].BranchSkip.Single(e => e.Name == "Branch 5")); + leftEntities[2].BranchSkip.Add( + context.Set().CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7724; + e.Name = "Z7724"; + })); - rightEntities[2].OneSkip.Remove(rightEntities[2].OneSkip.Single(e => e.Id == 8)); - rightEntities[2].OneSkip.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7714)); + rightEntities[2].OneSkip.Remove(rightEntities[2].OneSkip.Single(e => e.Name == "EntityOne 8")); + rightEntities[2].OneSkip.Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7714; + e.Name = "Z7714"; + })); if (RequiresDetectChanges) { @@ -1700,8 +2019,8 @@ public virtual void Can_update_many_to_many_with_inheritance() }, context => { - var leftEntities = context.Set().Include(e => e.BranchSkip).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.OneSkip).ToList(); + var leftEntities = context.Set().Include(e => e.BranchSkip).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.OneSkip).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, 24, 14, 55 - 4); }); @@ -1719,25 +2038,25 @@ static void ValidateFixup( Assert.Equal(joinCount, context.ChangeTracker.Entries().Count()); Assert.Equal(leftCount + rightCount + joinCount, context.ChangeTracker.Entries().Count()); - Assert.Contains(leftEntities[0].BranchSkip, e => e.Id == 7721); - Assert.Contains(leftEntities[0].BranchSkip, e => e.Id == 7722); - Assert.Contains(leftEntities[0].BranchSkip, e => e.Id == 7723); + Assert.Contains(leftEntities[0].BranchSkip, e => e.Name == "Z7721"); + Assert.Contains(leftEntities[0].BranchSkip, e => e.Name == "Z7722"); + Assert.Contains(leftEntities[0].BranchSkip, e => e.Name == "Z7723"); - Assert.Contains(rightEntities[0].OneSkip, e => e.Id == 7711); - Assert.Contains(rightEntities[0].OneSkip, e => e.Id == 7712); - Assert.Contains(rightEntities[0].OneSkip, e => e.Id == 7713); + Assert.Contains(rightEntities[0].OneSkip, e => e.Name == "Z7711"); + Assert.Contains(rightEntities[0].OneSkip, e => e.Name == "Z7712"); + Assert.Contains(rightEntities[0].OneSkip, e => e.Name == "Z7713"); - Assert.DoesNotContain(leftEntities[1].BranchSkip, e => e.Id == 1); - Assert.DoesNotContain(rightEntities[1].OneSkip, e => e.Id == 1); + Assert.DoesNotContain(leftEntities[1].BranchSkip, e => e.Name == "Branch 4"); + Assert.DoesNotContain(rightEntities[1].OneSkip, e => e.Name == "EntityOne 9"); - Assert.DoesNotContain(leftEntities[2].BranchSkip, e => e.Id == 1); - Assert.Contains(leftEntities[2].BranchSkip, e => e.Id == 7724); + Assert.DoesNotContain(leftEntities[4].BranchSkip, e => e.Name == "Branch 5"); + Assert.Contains(leftEntities[2].BranchSkip, e => e.Name == "Z7724"); - Assert.DoesNotContain(rightEntities[2].OneSkip, e => e.Id == 1); - Assert.Contains(rightEntities[2].OneSkip, e => e.Id == 7714); + Assert.DoesNotContain(rightEntities[2].OneSkip, e => e.Name == "EntityOne 8"); + Assert.Contains(rightEntities[2].OneSkip, e => e.Name == "Z7714"); - var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var count = 0; foreach (var left in allLeft) @@ -1768,20 +2087,23 @@ static void ValidateFixup( [InlineData(true)] public virtual async Task Can_insert_many_to_many_self_with_payload(bool async) { + List leftKeys = null; + List rightKeys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { var leftEntities = new[] { - context.EntityOnes.CreateInstance((e, p) => e.Id = 7711), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7712), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7713) + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7711), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7712), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7713) }; var rightEntities = new[] { - context.EntityOnes.CreateInstance((e, p) => e.Id = 7721), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7722), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7723) + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].SelfSkipPayloadLeft = CreateCollection(); @@ -1819,23 +2141,29 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities, postSave: true); + + leftKeys = leftEntities.Select(e => e.Id).ToList(); + rightKeys = rightEntities.Select(e => e.Id).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Id > 7700).Include(e => e.SelfSkipPayloadLeft); + var queryable = context.Set() + .Where(e => leftKeys.Contains(e.Id) || rightKeys.Contains(e.Id)) + .Include(e => e.SelfSkipPayloadLeft); + var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(6, results.Count); var leftEntities = context.ChangeTracker.Entries() .Select(e => e.Entity) - .Where(e => e.Id < 7720) - .OrderBy(e => e.Id) + .Where(e => leftKeys.Contains(e.Id)) + .OrderBy(e => e.Name) .ToList(); var rightEntities = context.ChangeTracker.Entries() .Select(e => e.Entity) - .Where(e => e.Id > 7720) - .OrderBy(e => e.Id) + .Where(e => rightKeys.Contains(e.Id)) + .OrderBy(e => e.Name) .ToList(); ValidateFixup(context, leftEntities, rightEntities, postSave: true); @@ -1878,52 +2206,118 @@ void ValidateFixup(DbContext context, IList leftEntities, IList keys = null; + ExecuteWithStrategyInTransaction( context => { - var leftEntities = context.Set().Include(e => e.SelfSkipPayloadRight).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.SelfSkipPayloadLeft).ToList(); + var leftEntities = context.Set().Include(e => e.SelfSkipPayloadRight).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.SelfSkipPayloadLeft).OrderBy(e => e.Name).ToList(); + + var ones = new[] + { + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7724; + e.Name = "Z7724"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7711; + e.Name = "Z7711"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7712; + e.Name = "Z7712"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7713; + e.Name = "Z7713"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7714; + e.Name = "Z7714"; + }) + }; - leftEntities[0].SelfSkipPayloadRight.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7721)); - leftEntities[0].SelfSkipPayloadRight.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7722)); - leftEntities[0].SelfSkipPayloadRight.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7723)); + leftEntities[0].SelfSkipPayloadRight.Add(ones[0]); + leftEntities[0].SelfSkipPayloadRight.Add(ones[1]); + leftEntities[0].SelfSkipPayloadRight.Add(ones[2]); - rightEntities[0].SelfSkipPayloadLeft.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7711)); - rightEntities[0].SelfSkipPayloadLeft.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7712)); - rightEntities[0].SelfSkipPayloadLeft.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7713)); + rightEntities[0].SelfSkipPayloadLeft.Add(ones[4]); + rightEntities[0].SelfSkipPayloadLeft.Add(ones[5]); + rightEntities[0].SelfSkipPayloadLeft.Add(ones[6]); - leftEntities[2].SelfSkipPayloadRight.Remove(leftEntities[2].SelfSkipPayloadRight.Single(e => e.Id == 6)); - rightEntities[1].SelfSkipPayloadLeft.Remove(rightEntities[1].SelfSkipPayloadLeft.Single(e => e.Id == 13)); + leftEntities[7].SelfSkipPayloadRight.Remove(leftEntities[7].SelfSkipPayloadRight.Single(e => e.Name == "EntityOne 6")); + rightEntities[11].SelfSkipPayloadLeft + .Remove(rightEntities[11].SelfSkipPayloadLeft.Single(e => e.Name == "EntityOne 13")); - leftEntities[4].SelfSkipPayloadRight.Remove(leftEntities[4].SelfSkipPayloadRight.Single(e => e.Id == 3)); - leftEntities[4].SelfSkipPayloadRight.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7724)); + leftEntities[4].SelfSkipPayloadRight.Remove(leftEntities[4].SelfSkipPayloadRight.Single(e => e.Name == "EntityOne 18")); + leftEntities[4].SelfSkipPayloadRight.Add(ones[3]); - rightEntities[4].SelfSkipPayloadLeft.Remove(rightEntities[4].SelfSkipPayloadLeft.Single(e => e.Id == 6)); - rightEntities[4].SelfSkipPayloadLeft.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7714)); + rightEntities[4].SelfSkipPayloadLeft.Remove(rightEntities[4].SelfSkipPayloadLeft.Single(e => e.Name == "EntityOne 6")); + rightEntities[4].SelfSkipPayloadLeft.Add(ones[7]); if (RequiresDetectChanges) { context.ChangeTracker.DetectChanges(); } - context.Find(7712, 1).Payload = new DateTime(1973, 9, 3); - context.Find(20, 16).Payload = new DateTime(1969, 8, 3); + keys = ones.Select(e => context.Entry(e).Property(e => e.Id).CurrentValue).ToList(); + + context.Find( + keys[5], + context.Entry(context.EntityOnes.Local.Single(e => e.Name == "EntityOne 1")).Property(e => e.Id).CurrentValue) + .Payload = new DateTime(1973, 9, 3); + + context.Find( + context.Entry(context.EntityOnes.Local.Single(e => e.Name == "EntityOne 20")).Property(e => e.Id).CurrentValue, + context.Entry(context.EntityOnes.Local.Single(e => e.Name == "EntityOne 16")).Property(e => e.Id).CurrentValue) + .Payload = new DateTime(1969, 8, 3); ValidateFixup(context, leftEntities, rightEntities, 28, 37, postSave: false); context.SaveChanges(); + keys = ones.Select(e => e.Id).ToList(); + ValidateFixup(context, leftEntities, rightEntities, 28, 37 - 4, postSave: true); }, context => { - var leftEntities = context.Set().Include(e => e.SelfSkipPayloadRight).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.SelfSkipPayloadLeft).ToList(); + var leftEntities = context.Set().Include(e => e.SelfSkipPayloadRight).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.SelfSkipPayloadLeft).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, 28, 37 - 4, postSave: true); }); - static void ValidateFixup( + void ValidateFixup( DbContext context, List leftEntities, List rightEntities, @@ -1935,22 +2329,22 @@ static void ValidateFixup( Assert.Equal(joinCount, context.ChangeTracker.Entries().Count()); Assert.Equal(count + joinCount, context.ChangeTracker.Entries().Count()); - Assert.Contains(leftEntities[0].SelfSkipPayloadRight, e => e.Id == 7721); - Assert.Contains(leftEntities[0].SelfSkipPayloadRight, e => e.Id == 7722); - Assert.Contains(leftEntities[0].SelfSkipPayloadRight, e => e.Id == 7723); + Assert.Contains(leftEntities[0].SelfSkipPayloadRight, e => context.Entry(e).Property(e => e.Id).CurrentValue == keys[0]); + Assert.Contains(leftEntities[0].SelfSkipPayloadRight, e => context.Entry(e).Property(e => e.Id).CurrentValue == keys[1]); + Assert.Contains(leftEntities[0].SelfSkipPayloadRight, e => context.Entry(e).Property(e => e.Id).CurrentValue == keys[2]); - Assert.Contains(rightEntities[0].SelfSkipPayloadLeft, e => e.Id == 7711); - Assert.Contains(rightEntities[0].SelfSkipPayloadLeft, e => e.Id == 7712); - Assert.Contains(rightEntities[0].SelfSkipPayloadLeft, e => e.Id == 7713); + Assert.Contains(rightEntities[0].SelfSkipPayloadLeft, e => context.Entry(e).Property(e => e.Id).CurrentValue == keys[4]); + Assert.Contains(rightEntities[0].SelfSkipPayloadLeft, e => context.Entry(e).Property(e => e.Id).CurrentValue == keys[5]); + Assert.Contains(rightEntities[0].SelfSkipPayloadLeft, e => context.Entry(e).Property(e => e.Id).CurrentValue == keys[6]); - Assert.DoesNotContain(leftEntities[2].SelfSkipPayloadRight, e => e.Id == 6); - Assert.DoesNotContain(rightEntities[1].SelfSkipPayloadLeft, e => e.Id == 13); + Assert.DoesNotContain(leftEntities[7].SelfSkipPayloadRight, e => e.Name == "EntityOne 6"); + Assert.DoesNotContain(rightEntities[11].SelfSkipPayloadLeft, e => e.Name == "EntityOne 13"); - Assert.DoesNotContain(leftEntities[4].SelfSkipPayloadRight, e => e.Id == 3); - Assert.Contains(leftEntities[4].SelfSkipPayloadRight, e => e.Id == 7724); + Assert.DoesNotContain(leftEntities[4].SelfSkipPayloadRight, e => e.Name == "EntityOne 2"); + Assert.Contains(leftEntities[4].SelfSkipPayloadRight, e => context.Entry(e).Property(e => e.Id).CurrentValue == keys[3]); - Assert.DoesNotContain(rightEntities[4].SelfSkipPayloadLeft, e => e.Id == 6); - Assert.Contains(rightEntities[4].SelfSkipPayloadLeft, e => e.Id == 7714); + Assert.DoesNotContain(rightEntities[4].SelfSkipPayloadLeft, e => e.Name == "EntityOne 6"); + Assert.Contains(rightEntities[4].SelfSkipPayloadLeft, e => context.Entry(e).Property(e => e.Id).CurrentValue == keys[7]); foreach (var joinEntry in context.ChangeTracker.Entries().ToList()) { @@ -1960,7 +2354,7 @@ static void ValidateFixup( Assert.Contains(joinEntity, joinEntity.Left.JoinSelfPayloadLeft); Assert.Contains(joinEntity, joinEntity.Right.JoinSelfPayloadRight); - if (joinEntity.LeftId == 7712 + if (joinEntity.LeftId == keys[5] && joinEntity.RightId == 1) { Assert.Equal(postSave ? EntityState.Unchanged : EntityState.Added, joinEntry.State); @@ -1975,8 +2369,8 @@ static void ValidateFixup( } } - var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var joins = 0; foreach (var left in allLeft) @@ -2007,20 +2401,22 @@ static void ValidateFixup( [InlineData(true)] public virtual async Task Can_insert_many_to_many_shared_with_payload(bool async) { + List keys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { var leftEntities = new[] { - context.EntityOnes.CreateInstance((e, p) => e.Id = 7711), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7712), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7713) + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7711), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7712), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7713) }; var rightEntities = new[] { - context.EntityThrees.CreateInstance((e, p) => e.Id = 7721), - context.EntityThrees.CreateInstance((e, p) => e.Id = 7722), - context.EntityThrees.CreateInstance((e, p) => e.Id = 7723) + context.EntityThrees.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.EntityThrees.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.EntityThrees.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].ThreeSkipPayloadFullShared = CreateCollection(); @@ -2058,15 +2454,17 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities, postSave: true); + + keys = leftEntities.Select(e => e.Id).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Id > 7700).Include(e => e.ThreeSkipPayloadFullShared); + var queryable = context.Set().Where(e => keys.Contains(e.Id)).Include(e => e.ThreeSkipPayloadFullShared); var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(3, results.Count); - var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, postSave: true); }); @@ -2104,33 +2502,90 @@ public virtual void Can_update_many_to_many_shared_with_payload() ExecuteWithStrategyInTransaction( context => { - var leftEntities = context.Set().Include(e => e.ThreeSkipPayloadFullShared).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.OneSkipPayloadFullShared).ToList(); + var leftEntities = context.Set().Include(e => e.ThreeSkipPayloadFullShared).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.OneSkipPayloadFullShared).OrderBy(e => e.Name).ToList(); - leftEntities[0].ThreeSkipPayloadFullShared.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7721)); - leftEntities[0].ThreeSkipPayloadFullShared.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7722)); - leftEntities[0].ThreeSkipPayloadFullShared.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7723)); - - rightEntities[0].OneSkipPayloadFullShared.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7711)); - rightEntities[0].OneSkipPayloadFullShared.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7712)); - rightEntities[0].OneSkipPayloadFullShared.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7713)); - - leftEntities[2].ThreeSkipPayloadFullShared.Remove(leftEntities[2].ThreeSkipPayloadFullShared.Single(e => e.Id == 2)); - rightEntities[4].OneSkipPayloadFullShared.Remove(rightEntities[4].OneSkipPayloadFullShared.Single(e => e.Id == 4)); + leftEntities[0].ThreeSkipPayloadFullShared.Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + })); + leftEntities[0].ThreeSkipPayloadFullShared.Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + })); + leftEntities[0].ThreeSkipPayloadFullShared.Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + })); - leftEntities[3].ThreeSkipPayloadFullShared.Remove(leftEntities[3].ThreeSkipPayloadFullShared.Single(e => e.Id == 18)); - leftEntities[3].ThreeSkipPayloadFullShared.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7724)); + rightEntities[0].OneSkipPayloadFullShared.Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7711; + e.Name = "Z7711"; + })); + rightEntities[0].OneSkipPayloadFullShared.Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7712; + e.Name = "Z7712"; + })); + rightEntities[0].OneSkipPayloadFullShared.Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7713; + e.Name = "Z7713"; + })); - rightEntities[2].OneSkipPayloadFullShared.Remove(rightEntities[2].OneSkipPayloadFullShared.Single(e => e.Id == 13)); - rightEntities[2].OneSkipPayloadFullShared.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7714)); + leftEntities[2].ThreeSkipPayloadFullShared + .Remove(leftEntities[2].ThreeSkipPayloadFullShared.Single(e => e.Name == "EntityThree 10")); + rightEntities[4].OneSkipPayloadFullShared + .Remove(rightEntities[4].OneSkipPayloadFullShared.Single(e => e.Name == "EntityOne 6")); + + leftEntities[3].ThreeSkipPayloadFullShared + .Remove(leftEntities[3].ThreeSkipPayloadFullShared.Single(e => e.Name == "EntityThree 17")); + leftEntities[3].ThreeSkipPayloadFullShared + .Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7724; + e.Name = "Z7724"; + })); + + rightEntities[2].OneSkipPayloadFullShared + .Remove(rightEntities[2].OneSkipPayloadFullShared.Single(e => e.Name == "EntityOne 12")); + rightEntities[2].OneSkipPayloadFullShared + .Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7714; + e.Name = "Z7714"; + })); if (RequiresDetectChanges) { context.ChangeTracker.DetectChanges(); } - context.Set>("JoinOneToThreePayloadFullShared").Find(7712, 1)["Payload"] = "Set!"; - context.Set>("JoinOneToThreePayloadFullShared").Find(20, 16)["Payload"] = "Changed!"; + var joinSet = context.Set>("JoinOneToThreePayloadFullShared"); + joinSet.Find( + GetEntityOneId(context, "Z7712"), GetEntityThreeId(context, "EntityThree 1"))["Payload"] = "Set!"; + joinSet.Find( + GetEntityOneId(context, "EntityOne 20"), GetEntityThreeId(context, "EntityThree 16"))["Payload"] = "Changed!"; ValidateFixup(context, leftEntities, rightEntities, 24, 24, 48, postSave: false); @@ -2140,14 +2595,20 @@ public virtual void Can_update_many_to_many_shared_with_payload() }, context => { - var leftEntities = context.Set().Include(e => e.ThreeSkipPayloadFullShared).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.OneSkipPayloadFullShared).ToList(); + var leftEntities = context.Set().Include(e => e.ThreeSkipPayloadFullShared).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.OneSkipPayloadFullShared).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, 24, 24, 48 - 4, postSave: true); }); + static int GetEntityOneId(ManyToManyContext context, string name) + => context.Entry(context.EntityOnes.Local.Single(e => e.Name == name)).Property(e => e.Id).CurrentValue; + + static int GetEntityThreeId(ManyToManyContext context, string name) + => context.Entry(context.EntityThrees.Local.Single(e => e.Name == name)).Property(e => e.Id).CurrentValue; + static void ValidateFixup( - DbContext context, + ManyToManyContext context, List leftEntities, List rightEntities, int leftCount, @@ -2160,35 +2621,40 @@ static void ValidateFixup( Assert.Equal(joinCount, context.ChangeTracker.Entries>().Count()); Assert.Equal(leftCount + rightCount + joinCount, context.ChangeTracker.Entries().Count()); - Assert.Contains(leftEntities[0].ThreeSkipPayloadFullShared, e => e.Id == 7721); - Assert.Contains(leftEntities[0].ThreeSkipPayloadFullShared, e => e.Id == 7722); - Assert.Contains(leftEntities[0].ThreeSkipPayloadFullShared, e => e.Id == 7723); + Assert.Contains(leftEntities[0].ThreeSkipPayloadFullShared, e => e.Name == "Z7721"); + Assert.Contains(leftEntities[0].ThreeSkipPayloadFullShared, e => e.Name == "Z7722"); + Assert.Contains(leftEntities[0].ThreeSkipPayloadFullShared, e => e.Name == "Z7723"); + + Assert.Contains(rightEntities[0].OneSkipPayloadFullShared, e => e.Name == "Z7711"); + Assert.Contains(rightEntities[0].OneSkipPayloadFullShared, e => e.Name == "Z7712"); + Assert.Contains(rightEntities[0].OneSkipPayloadFullShared, e => e.Name == "Z7713"); - Assert.Contains(rightEntities[0].OneSkipPayloadFullShared, e => e.Id == 7711); - Assert.Contains(rightEntities[0].OneSkipPayloadFullShared, e => e.Id == 7712); - Assert.Contains(rightEntities[0].OneSkipPayloadFullShared, e => e.Id == 7713); + Assert.DoesNotContain(leftEntities[2].ThreeSkipPayloadFullShared, e => e.Name == "EntityThree 10"); + Assert.DoesNotContain(rightEntities[4].OneSkipPayloadFullShared, e => e.Name == "EntityOne 6"); - Assert.DoesNotContain(leftEntities[2].ThreeSkipPayloadFullShared, e => e.Id == 2); - Assert.DoesNotContain(rightEntities[4].OneSkipPayloadFullShared, e => e.Id == 4); + Assert.DoesNotContain(leftEntities[3].ThreeSkipPayloadFullShared, e => e.Name == "EntityThree 17"); + Assert.Contains(leftEntities[3].ThreeSkipPayloadFullShared, e => e.Name == "Z7724"); - Assert.DoesNotContain(leftEntities[3].ThreeSkipPayloadFullShared, e => e.Id == 18); - Assert.Contains(leftEntities[3].ThreeSkipPayloadFullShared, e => e.Id == 7724); + Assert.DoesNotContain(rightEntities[2].OneSkipPayloadFullShared, e => e.Name == "EntityOne 12"); + Assert.Contains(rightEntities[2].OneSkipPayloadFullShared, e => e.Name == "Z7714"); - Assert.DoesNotContain(rightEntities[2].OneSkipPayloadFullShared, e => e.Id == 13); - Assert.Contains(rightEntities[2].OneSkipPayloadFullShared, e => e.Id == 7714); + var oneId1 = GetEntityOneId(context, "Z7712"); + var threeId1 = GetEntityThreeId(context, "EntityThree 1"); + var oneId2 = GetEntityOneId(context, "EntityOne 20"); + var threeId2 = GetEntityThreeId(context, "EntityThree 20"); foreach (var joinEntry in context.ChangeTracker.Entries>().ToList()) { var joinEntity = joinEntry.Entity; - if ((int)joinEntity["OneId"] == 7712 - && (int)joinEntity["ThreeId"] == 1) + if (context.Entry(joinEntity).Property("OneId").CurrentValue == oneId1 + && context.Entry(joinEntity).Property("ThreeId").CurrentValue == threeId1) { Assert.Equal(postSave ? EntityState.Unchanged : EntityState.Added, joinEntry.State); Assert.Equal("Set!", joinEntity["Payload"]); } - else if ((int)joinEntity["OneId"] == 20 - && (int)joinEntity["ThreeId"] == 20) + else if (context.Entry(joinEntity).Property("OneId").CurrentValue == oneId2 + && context.Entry(joinEntity).Property("ThreeId").CurrentValue == threeId2) { Assert.Equal(postSave ? EntityState.Unchanged : EntityState.Modified, joinEntry.State); Assert.Equal(!postSave, joinEntry.Property("Payload").IsModified); @@ -2196,8 +2662,8 @@ static void ValidateFixup( } } - var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var count = 0; foreach (var left in allLeft) @@ -2228,20 +2694,22 @@ static void ValidateFixup( [InlineData(true)] public virtual async Task Can_insert_many_to_many_shared(bool async) { + List keys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { var leftEntities = new[] { - context.EntityOnes.CreateInstance((e, p) => e.Id = 7711), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7712), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7713) + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7711), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7712), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7713) }; var rightEntities = new[] { - context.EntityTwos.CreateInstance((e, p) => e.Id = 7721), - context.EntityTwos.CreateInstance((e, p) => e.Id = 7722), - context.EntityTwos.CreateInstance((e, p) => e.Id = 7723) + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].TwoSkipShared = CreateCollection(); @@ -2279,15 +2747,17 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities); + + keys = leftEntities.Select(e => e.Id).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Id > 7700).Include(e => e.TwoSkipShared); + var queryable = context.Set().Where(e => keys.Contains(e.Id)).Include(e => e.TwoSkipShared); var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(3, results.Count); - var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities); }); @@ -2315,25 +2785,81 @@ public virtual void Can_update_many_to_many_shared() ExecuteWithStrategyInTransaction( context => { - var leftEntities = context.Set().Include(e => e.TwoSkipShared).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.OneSkipShared).ToList(); + var leftEntities = context.Set().Include(e => e.TwoSkipShared).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.OneSkipShared).OrderBy(e => e.Name).ToList(); + + var twos = new[] + { + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7724; + e.Name = "Z7724"; + }), + }; + + var ones = new[] + { + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7711; + e.Name = "Z7711"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7712; + e.Name = "Z7712"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7713; + e.Name = "Z7713"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7714; + e.Name = "Z7714"; + }), + }; - leftEntities[0].TwoSkipShared.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7721)); - leftEntities[0].TwoSkipShared.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7722)); - leftEntities[0].TwoSkipShared.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7723)); + leftEntities[0].TwoSkipShared.Add(twos[0]); + leftEntities[0].TwoSkipShared.Add(twos[1]); + leftEntities[0].TwoSkipShared.Add(twos[2]); - rightEntities[0].OneSkipShared.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7711)); - rightEntities[0].OneSkipShared.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7712)); - rightEntities[0].OneSkipShared.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7713)); + rightEntities[0].OneSkipShared.Add(ones[0]); + rightEntities[0].OneSkipShared.Add(ones[1]); + rightEntities[0].OneSkipShared.Add(ones[2]); - leftEntities[1].TwoSkipShared.Remove(leftEntities[1].TwoSkipShared.Single(e => e.Id == 3)); - rightEntities[1].OneSkipShared.Remove(rightEntities[1].OneSkipShared.Single(e => e.Id == 5)); + leftEntities[1].TwoSkipShared.Remove(leftEntities[1].TwoSkipShared.Single(e => e.Name == "EntityTwo 17")); + rightEntities[1].OneSkipShared.Remove(rightEntities[1].OneSkipShared.Single(e => e.Name == "EntityOne 3")); - leftEntities[2].TwoSkipShared.Remove(leftEntities[2].TwoSkipShared.Single(e => e.Id == 10)); - leftEntities[2].TwoSkipShared.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7724)); + leftEntities[2].TwoSkipShared.Remove(leftEntities[2].TwoSkipShared.Single(e => e.Name == "EntityTwo 18")); + leftEntities[2].TwoSkipShared.Add(twos[3]); - rightEntities[2].OneSkipShared.Remove(rightEntities[2].OneSkipShared.Single(e => e.Id == 7)); - rightEntities[2].OneSkipShared.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7714)); + rightEntities[2].OneSkipShared.Remove(rightEntities[2].OneSkipShared.Single(e => e.Name == "EntityOne 9")); + rightEntities[2].OneSkipShared.Add(ones[3]); if (RequiresDetectChanges) { @@ -2348,8 +2874,8 @@ public virtual void Can_update_many_to_many_shared() }, context => { - var leftEntities = context.Set().Include(e => e.TwoSkipShared).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.OneSkipShared).ToList(); + var leftEntities = context.Set().Include(e => e.TwoSkipShared).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.OneSkipShared).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, 24, 24, 49); }); @@ -2367,25 +2893,25 @@ static void ValidateFixup( Assert.Equal(joinCount, context.ChangeTracker.Entries>().Count()); Assert.Equal(leftCount + rightCount + joinCount, context.ChangeTracker.Entries().Count()); - Assert.Contains(leftEntities[0].TwoSkipShared, e => e.Id == 7721); - Assert.Contains(leftEntities[0].TwoSkipShared, e => e.Id == 7722); - Assert.Contains(leftEntities[0].TwoSkipShared, e => e.Id == 7723); + Assert.Contains(leftEntities[0].TwoSkipShared, e => e.Name == "Z7721"); + Assert.Contains(leftEntities[0].TwoSkipShared, e => e.Name == "Z7722"); + Assert.Contains(leftEntities[0].TwoSkipShared, e => e.Name == "Z7723"); - Assert.Contains(rightEntities[0].OneSkipShared, e => e.Id == 7711); - Assert.Contains(rightEntities[0].OneSkipShared, e => e.Id == 7712); - Assert.Contains(rightEntities[0].OneSkipShared, e => e.Id == 7713); + Assert.Contains(rightEntities[0].OneSkipShared, e => e.Name == "Z7711"); + Assert.Contains(rightEntities[0].OneSkipShared, e => e.Name == "Z7712"); + Assert.Contains(rightEntities[0].OneSkipShared, e => e.Name == "Z7713"); - Assert.DoesNotContain(leftEntities[1].TwoSkipShared, e => e.Id == 3); - Assert.DoesNotContain(rightEntities[1].OneSkipShared, e => e.Id == 6); + Assert.DoesNotContain(leftEntities[1].TwoSkipShared, e => e.Name == "EntityTwo 17"); + Assert.DoesNotContain(rightEntities[1].OneSkipShared, e => e.Name == "EntityOne 3"); - Assert.DoesNotContain(leftEntities[2].TwoSkipShared, e => e.Id == 10); - Assert.Contains(leftEntities[2].TwoSkipShared, e => e.Id == 7724); + Assert.DoesNotContain(leftEntities[2].TwoSkipShared, e => e.Name == "EntityTwo 18"); + Assert.Contains(leftEntities[2].TwoSkipShared, e => e.Name == "Z7724"); - Assert.DoesNotContain(rightEntities[2].OneSkipShared, e => e.Id == 7); - Assert.Contains(rightEntities[2].OneSkipShared, e => e.Id == 7714); + Assert.DoesNotContain(rightEntities[2].OneSkipShared, e => e.Name == "EntityOne 9"); + Assert.Contains(rightEntities[2].OneSkipShared, e => e.Name == "Z7714"); - var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var count = 0; foreach (var left in allLeft) @@ -2416,20 +2942,22 @@ static void ValidateFixup( [InlineData(true)] public virtual async Task Can_insert_many_to_many_with_payload(bool async) { + List keys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { var leftEntities = new[] { - context.EntityOnes.CreateInstance((e, p) => e.Id = 7711), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7712), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7713) + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7711), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7712), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7713) }; var rightEntities = new[] { - context.EntityThrees.CreateInstance((e, p) => e.Id = 7721), - context.EntityThrees.CreateInstance((e, p) => e.Id = 7722), - context.EntityThrees.CreateInstance((e, p) => e.Id = 7723) + context.EntityThrees.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.EntityThrees.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.EntityThrees.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].ThreeSkipPayloadFull = CreateCollection(); @@ -2467,15 +2995,17 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities, postSave: true); + + keys = leftEntities.Select(e => e.Id).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Id > 7700).Include(e => e.ThreeSkipPayloadFull); + var queryable = context.Set().Where(e => keys.Contains(e.Id)).Include(e => e.ThreeSkipPayloadFull); var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(3, results.Count); - var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, postSave: true); }); @@ -2516,33 +3046,88 @@ public virtual void Can_update_many_to_many_with_payload() ExecuteWithStrategyInTransaction( context => { - var leftEntities = context.Set().Include(e => e.ThreeSkipPayloadFull).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.OneSkipPayloadFull).ToList(); + var leftEntities = context.Set().Include(e => e.ThreeSkipPayloadFull).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.OneSkipPayloadFull).OrderBy(e => e.Name).ToList(); - leftEntities[0].ThreeSkipPayloadFull.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7721)); - leftEntities[0].ThreeSkipPayloadFull.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7722)); - leftEntities[0].ThreeSkipPayloadFull.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7723)); + leftEntities[0].ThreeSkipPayloadFull.Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + })); + leftEntities[0].ThreeSkipPayloadFull.Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + })); + leftEntities[0].ThreeSkipPayloadFull.Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + })); - rightEntities[0].OneSkipPayloadFull.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7711)); - rightEntities[0].OneSkipPayloadFull.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7712)); - rightEntities[0].OneSkipPayloadFull.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7713)); + rightEntities[0].OneSkipPayloadFull.Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7711; + e.Name = "Z7711"; + })); + rightEntities[0].OneSkipPayloadFull.Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7712; + e.Name = "Z7712"; + })); + rightEntities[0].OneSkipPayloadFull.Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7713; + e.Name = "Z7713"; + })); - leftEntities[1].ThreeSkipPayloadFull.Remove(leftEntities[1].ThreeSkipPayloadFull.Single(e => e.Id == 9)); - rightEntities[1].OneSkipPayloadFull.Remove(rightEntities[1].OneSkipPayloadFull.Single(e => e.Id == 4)); + leftEntities[1].ThreeSkipPayloadFull + .Remove(leftEntities[1].ThreeSkipPayloadFull.Single(e => e.Name == "EntityThree 10")); + rightEntities[1].OneSkipPayloadFull.Remove(rightEntities[1].OneSkipPayloadFull.Single(e => e.Name == "EntityOne 7")); - leftEntities[2].ThreeSkipPayloadFull.Remove(leftEntities[2].ThreeSkipPayloadFull.Single(e => e.Id == 5)); - leftEntities[2].ThreeSkipPayloadFull.Add(context.EntityThrees.CreateInstance((e, p) => e.Id = 7724)); + leftEntities[2].ThreeSkipPayloadFull + .Remove(leftEntities[2].ThreeSkipPayloadFull.Single(e => e.Name == "EntityThree 13")); + leftEntities[2].ThreeSkipPayloadFull.Add( + context.EntityThrees.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7724; + e.Name = "Z7724"; + })); - rightEntities[2].OneSkipPayloadFull.Remove(rightEntities[2].OneSkipPayloadFull.Single(e => e.Id == 8)); - rightEntities[2].OneSkipPayloadFull.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7714)); + rightEntities[2].OneSkipPayloadFull.Remove(rightEntities[2].OneSkipPayloadFull.Single(e => e.Name == "EntityOne 15")); + rightEntities[2].OneSkipPayloadFull.Add( + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7714; + e.Name = "Z7714"; + })); if (RequiresDetectChanges) { context.ChangeTracker.DetectChanges(); } - context.Find(7712, 1).Payload = "Set!"; - context.Find(20, 20).Payload = "Changed!"; + context.Find( + GetEntityOneId(context, "Z7712"), + GetEntityThreeId(context, "EntityThree 1")).Payload = "Set!"; + + context.Find( + GetEntityOneId(context, "EntityOne 20"), + GetEntityThreeId(context, "EntityThree 20")).Payload = "Changed!"; if (RequiresDetectChanges) { @@ -2557,14 +3142,20 @@ public virtual void Can_update_many_to_many_with_payload() }, context => { - var leftEntities = context.Set().Include(e => e.ThreeSkipPayloadFull).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.OneSkipPayloadFull).ToList(); + var leftEntities = context.Set().Include(e => e.ThreeSkipPayloadFull).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.OneSkipPayloadFull).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, 24, 24, 123 - 4, postSave: true); }); + static int GetEntityOneId(ManyToManyContext context, string name) + => context.Entry(context.EntityOnes.Local.Single(e => e.Name == name)).Property(e => e.Id).CurrentValue; + + static int GetEntityThreeId(ManyToManyContext context, string name) + => context.Entry(context.EntityThrees.Local.Single(e => e.Name == name)).Property(e => e.Id).CurrentValue; + static void ValidateFixup( - DbContext context, + ManyToManyContext context, List leftEntities, List rightEntities, int leftCount, @@ -2577,22 +3168,27 @@ static void ValidateFixup( Assert.Equal(joinCount, context.ChangeTracker.Entries().Count()); Assert.Equal(leftCount + rightCount + joinCount, context.ChangeTracker.Entries().Count()); - Assert.Contains(leftEntities[0].ThreeSkipPayloadFull, e => e.Id == 7721); - Assert.Contains(leftEntities[0].ThreeSkipPayloadFull, e => e.Id == 7722); - Assert.Contains(leftEntities[0].ThreeSkipPayloadFull, e => e.Id == 7723); + Assert.Contains(leftEntities[0].ThreeSkipPayloadFull, e => e.Name == "Z7721"); + Assert.Contains(leftEntities[0].ThreeSkipPayloadFull, e => e.Name == "Z7722"); + Assert.Contains(leftEntities[0].ThreeSkipPayloadFull, e => e.Name == "Z7723"); - Assert.Contains(rightEntities[0].OneSkipPayloadFull, e => e.Id == 7711); - Assert.Contains(rightEntities[0].OneSkipPayloadFull, e => e.Id == 7712); - Assert.Contains(rightEntities[0].OneSkipPayloadFull, e => e.Id == 7713); + Assert.Contains(rightEntities[0].OneSkipPayloadFull, e => e.Name == "Z7711"); + Assert.Contains(rightEntities[0].OneSkipPayloadFull, e => e.Name == "Z7712"); + Assert.Contains(rightEntities[0].OneSkipPayloadFull, e => e.Name == "Z7713"); - Assert.DoesNotContain(leftEntities[1].ThreeSkipPayloadFull, e => e.Id == 9); - Assert.DoesNotContain(rightEntities[1].OneSkipPayloadFull, e => e.Id == 4); + Assert.DoesNotContain(leftEntities[1].ThreeSkipPayloadFull, e => e.Name == "EntityThree 10"); + Assert.DoesNotContain(rightEntities[1].OneSkipPayloadFull, e => e.Name == "EntityOne 7"); - Assert.DoesNotContain(leftEntities[2].ThreeSkipPayloadFull, e => e.Id == 5); - Assert.Contains(leftEntities[2].ThreeSkipPayloadFull, e => e.Id == 7724); + Assert.DoesNotContain(leftEntities[2].ThreeSkipPayloadFull, e => e.Name == "EntityThree 13"); + Assert.Contains(leftEntities[2].ThreeSkipPayloadFull, e => e.Name == "Z7724"); - Assert.DoesNotContain(rightEntities[2].OneSkipPayloadFull, e => e.Id == 8); - Assert.Contains(rightEntities[2].OneSkipPayloadFull, e => e.Id == 7714); + Assert.DoesNotContain(rightEntities[2].OneSkipPayloadFull, e => e.Name == "EntityOne 15"); + Assert.Contains(rightEntities[2].OneSkipPayloadFull, e => e.Name == "Z7714"); + + var oneId1 = GetEntityOneId(context, "Z7712"); + var threeId1 = GetEntityThreeId(context, "EntityThree 1"); + var oneId2 = GetEntityOneId(context, "EntityOne 20"); + var threeId2 = GetEntityThreeId(context, "EntityThree 20"); foreach (var joinEntry in context.ChangeTracker.Entries().ToList()) { @@ -2602,14 +3198,14 @@ static void ValidateFixup( Assert.Contains(joinEntity, joinEntity.One.JoinThreePayloadFull); Assert.Contains(joinEntity, joinEntity.Three.JoinOnePayloadFull); - if (joinEntity.OneId == 7712 - && joinEntity.ThreeId == 1) + if (context.Entry(joinEntity).Property(e => e.OneId).CurrentValue == oneId1 + && context.Entry(joinEntity).Property(e => e.ThreeId).CurrentValue == threeId1) { Assert.Equal(postSave ? EntityState.Unchanged : EntityState.Added, joinEntry.State); Assert.Equal("Set!", joinEntity.Payload); } - else if (joinEntity.OneId == 20 - && joinEntity.ThreeId == 20) + else if (context.Entry(joinEntity).Property(e => e.OneId).CurrentValue == oneId2 + && context.Entry(joinEntity).Property(e => e.ThreeId).CurrentValue == threeId2) { Assert.Equal(postSave ? EntityState.Unchanged : EntityState.Modified, joinEntry.State); Assert.Equal(!postSave, joinEntry.Property(e => e.Payload).IsModified); @@ -2617,8 +3213,8 @@ static void ValidateFixup( } } - var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var count = 0; foreach (var left in allLeft) @@ -2650,18 +3246,18 @@ public virtual void Can_delete_with_many_to_many_with_navs() ExecuteWithStrategyInTransaction( context => { - var ones = context.Set().Include(e => e.ThreeSkipPayloadFull).OrderBy(e => e.Id).ToList(); - var threes = context.Set().Include(e => e.OneSkipPayloadFull).ToList(); + var ones = context.Set().Include(e => e.ThreeSkipPayloadFull).OrderBy(e => e.Name).ToList(); + var threes = context.Set().Include(e => e.OneSkipPayloadFull).OrderBy(e => e.Name).ToList(); // Make sure other related entities are loaded for delete fixup context.Set().Load(); context.Set().Load(); context.Set().Load(); - var toRemoveOne = context.Find(1); + var toRemoveOne = context.EntityOnes.Single(e => e.Name == "EntityOne 1"); var refCountOnes = threes.SelectMany(e => e.OneSkipPayloadFull).Count(e => e == toRemoveOne); - var toRemoveThree = context.Find(1); + var toRemoveThree = context.EntityThrees.Single(e => e.Name == "EntityThree 1"); var refCountThrees = ones.SelectMany(e => e.ThreeSkipPayloadFull).Count(e => e == toRemoveThree); foreach (var joinEntity in context.ChangeTracker.Entries().Select(e => e.Entity).ToList()) @@ -2716,8 +3312,8 @@ public virtual void Can_delete_with_many_to_many_with_navs() }, context => { - var ones = context.Set().Include(e => e.ThreeSkipPayloadFull).OrderBy(e => e.Id).ToList(); - var threes = context.Set().Include(e => e.OneSkipPayloadFull).ToList(); + var ones = context.Set().Include(e => e.ThreeSkipPayloadFull).OrderBy(e => e.Name).ToList(); + var threes = context.Set().Include(e => e.OneSkipPayloadFull).OrderBy(e => e.Name).ToList(); ValidateNavigations(ones, threes); @@ -2774,20 +3370,22 @@ static void ValidateJoinNavigations(DbContext context) [InlineData(true)] public virtual async Task Can_insert_many_to_many(bool async) { + List keys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { var leftEntities = new[] { - context.EntityOnes.CreateInstance((e, p) => e.Id = 7711), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7712), - context.EntityOnes.CreateInstance((e, p) => e.Id = 7713) + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7711), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7712), + context.EntityOnes.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7713) }; var rightEntities = new[] { - context.EntityTwos.CreateInstance((e, p) => e.Id = 7721), - context.EntityTwos.CreateInstance((e, p) => e.Id = 7722), - context.EntityTwos.CreateInstance((e, p) => e.Id = 7723) + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.EntityTwos.CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].TwoSkip = CreateCollection(); @@ -2825,15 +3423,17 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities); + + keys = leftEntities.Select(e => e.Id).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Id > 7700).Include(e => e.TwoSkip); + var queryable = context.Set().Where(e => keys.Contains(e.Id)).Include(e => e.TwoSkip); var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(3, results.Count); - var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities); }); @@ -2858,49 +3458,114 @@ static void ValidateFixup(DbContext context, IList leftEntities, ILis [ConditionalFact] public virtual void Can_update_many_to_many() { + List oneIds = null; + List twoIds = null; + ExecuteWithStrategyInTransaction( context => { - var leftEntities = context.Set().Include(e => e.TwoSkip).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.OneSkip).ToList(); + var leftEntities = context.Set().Include(e => e.TwoSkip).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.OneSkip).OrderBy(e => e.Name).ToList(); + + var twos = new[] + { + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7721; + e.Name = "Z7721"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7722; + e.Name = "Z7722"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7723; + e.Name = "Z7723"; + }), + context.EntityTwos.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7724; + e.Name = "Z7724"; + }) + }; + + var ones = new[] + { + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7711; + e.Name = "Z7711"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7712; + e.Name = "Z7712"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7713; + e.Name = "Z7713"; + }), + context.EntityOnes.CreateInstance( + (e, p) => + { + e.Id = Fixture.UseGeneratedKeys ? 0 : 7714; + e.Name = "Z7714"; + }), + }; - leftEntities[0].TwoSkip.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7721)); - leftEntities[0].TwoSkip.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7722)); - leftEntities[0].TwoSkip.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7723)); + leftEntities[0].TwoSkip.Add(twos[0]); + leftEntities[0].TwoSkip.Add(twos[1]); + leftEntities[0].TwoSkip.Add(twos[2]); - rightEntities[0].OneSkip.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7711)); - rightEntities[0].OneSkip.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7712)); - rightEntities[0].OneSkip.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7713)); + rightEntities[0].OneSkip.Add(ones[0]); + rightEntities[0].OneSkip.Add(ones[1]); + rightEntities[0].OneSkip.Add(ones[2]); - leftEntities[1].TwoSkip.Remove(leftEntities[1].TwoSkip.Single(e => e.Id == 1)); - rightEntities[1].OneSkip.Remove(rightEntities[1].OneSkip.Single(e => e.Id == 1)); + leftEntities[1].TwoSkip.Remove(leftEntities[1].TwoSkip.Single(e => e.Name == "EntityTwo 1")); + rightEntities[1].OneSkip.Remove(rightEntities[1].OneSkip.Single(e => e.Name == "EntityOne 1")); - leftEntities[2].TwoSkip.Remove(leftEntities[2].TwoSkip.Single(e => e.Id == 1)); - leftEntities[2].TwoSkip.Add(context.EntityTwos.CreateInstance((e, p) => e.Id = 7724)); + leftEntities[2].TwoSkip.Remove(leftEntities[2].TwoSkip.Single(e => e.Name == "EntityTwo 1")); + leftEntities[2].TwoSkip.Add(twos[3]); - rightEntities[2].OneSkip.Remove(rightEntities[2].OneSkip.Single(e => e.Id == 1)); - rightEntities[2].OneSkip.Add(context.EntityOnes.CreateInstance((e, p) => e.Id = 7714)); + rightEntities[2].OneSkip.Remove(rightEntities[2].OneSkip.Single(e => e.Name == "EntityOne 1")); + rightEntities[2].OneSkip.Add(ones[3]); if (RequiresDetectChanges) { context.ChangeTracker.DetectChanges(); } + oneIds = ones.Select(e => context.Entry(e).Property(e => e.Id).CurrentValue).ToList(); + twoIds = twos.Select(e => context.Entry(e).Property(e => e.Id).CurrentValue).ToList(); + ValidateFixup(context, leftEntities, rightEntities, 24, 24, 120); context.SaveChanges(); + oneIds = ones.Select(e => e.Id).ToList(); + twoIds = twos.Select(e => e.Id).ToList(); + ValidateFixup(context, leftEntities, rightEntities, 24, 24, 116); }, context => { - var leftEntities = context.Set().Include(e => e.TwoSkip).OrderBy(e => e.Id).ToList(); - var rightEntities = context.Set().Include(e => e.OneSkip).ToList(); + var leftEntities = context.Set().Include(e => e.TwoSkip).OrderBy(e => e.Name).ToList(); + var rightEntities = context.Set().Include(e => e.OneSkip).OrderBy(e => e.Name).ToList(); ValidateFixup(context, leftEntities, rightEntities, 24, 24, 116); }); - static void ValidateFixup( + void ValidateFixup( DbContext context, List leftEntities, List rightEntities, @@ -2913,25 +3578,25 @@ static void ValidateFixup( Assert.Equal(joinCount, context.ChangeTracker.Entries().Count()); Assert.Equal(leftCount + rightCount + joinCount, context.ChangeTracker.Entries().Count()); - Assert.Contains(leftEntities[0].TwoSkip, e => e.Id == 7721); - Assert.Contains(leftEntities[0].TwoSkip, e => e.Id == 7722); - Assert.Contains(leftEntities[0].TwoSkip, e => e.Id == 7723); + Assert.Contains(leftEntities[0].TwoSkip, e => context.Entry(e).Property(e => e.Id).CurrentValue == twoIds[0]); + Assert.Contains(leftEntities[0].TwoSkip, e => context.Entry(e).Property(e => e.Id).CurrentValue == twoIds[1]); + Assert.Contains(leftEntities[0].TwoSkip, e => context.Entry(e).Property(e => e.Id).CurrentValue == twoIds[2]); - Assert.Contains(rightEntities[0].OneSkip, e => e.Id == 7711); - Assert.Contains(rightEntities[0].OneSkip, e => e.Id == 7712); - Assert.Contains(rightEntities[0].OneSkip, e => e.Id == 7713); + Assert.Contains(rightEntities[0].OneSkip, e => context.Entry(e).Property(e => e.Id).CurrentValue == oneIds[0]); + Assert.Contains(rightEntities[0].OneSkip, e => context.Entry(e).Property(e => e.Id).CurrentValue == oneIds[1]); + Assert.Contains(rightEntities[0].OneSkip, e => context.Entry(e).Property(e => e.Id).CurrentValue == oneIds[2]); - Assert.DoesNotContain(leftEntities[1].TwoSkip, e => e.Id == 1); - Assert.DoesNotContain(rightEntities[1].OneSkip, e => e.Id == 1); + Assert.DoesNotContain(leftEntities[1].TwoSkip, e => e.Name == "EntityTwo 1"); + Assert.DoesNotContain(rightEntities[1].OneSkip, e => e.Name == "EntityOne 1"); - Assert.DoesNotContain(leftEntities[2].TwoSkip, e => e.Id == 1); - Assert.Contains(leftEntities[2].TwoSkip, e => e.Id == 7724); + Assert.DoesNotContain(leftEntities[2].TwoSkip, e => e.Name == "EntityTwo 1"); + Assert.Contains(leftEntities[2].TwoSkip, e => context.Entry(e).Property(e => e.Id).CurrentValue == twoIds[3]); - Assert.DoesNotContain(rightEntities[2].OneSkip, e => e.Id == 1); - Assert.Contains(rightEntities[2].OneSkip, e => e.Id == 7714); + Assert.DoesNotContain(rightEntities[2].OneSkip, e => e.Name == "EntityOne 1"); + Assert.Contains(rightEntities[2].OneSkip, e => context.Entry(e).Property(e => e.Id).CurrentValue == oneIds[3]); - var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var allLeft = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var allRight = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var count = 0; foreach (var left in allLeft) @@ -2960,21 +3625,26 @@ static void ValidateFixup( [ConditionalFact] public virtual void Can_delete_with_many_to_many() { + var oneId = 0; + var twoId = 0; + ExecuteWithStrategyInTransaction( context => { - var ones = context.Set().Include(e => e.TwoSkip).OrderBy(e => e.Id).ToList(); - var twos = context.Set().Include(e => e.OneSkip).ToList(); + var ones = context.Set().Include(e => e.TwoSkip).OrderBy(e => e.Name).ToList(); + var twos = context.Set().Include(e => e.OneSkip).OrderBy(e => e.Name).ToList(); // Make sure other related entities are loaded for delete fixup context.Set().Load(); context.Set().Load(); context.Set().Load(); - var toRemoveOne = context.Find(1); + var toRemoveOne = context.EntityOnes.Single(e => e.Name == "EntityOne 1"); + oneId = toRemoveOne.Id; var refCountOnes = twos.SelectMany(e => e.OneSkip).Count(e => e == toRemoveOne); - var toRemoveTwo = context.Find(1); + var toRemoveTwo = context.EntityTwos.Single(e => e.Name == "EntityTwo 1"); + twoId = toRemoveTwo.Id; var refCountTwos = ones.SelectMany(e => e.TwoSkip).Count(e => e == toRemoveTwo); context.Remove(toRemoveOne); @@ -2993,8 +3663,8 @@ public virtual void Can_delete_with_many_to_many() Assert.All( context.ChangeTracker.Entries(), e => Assert.Equal( - e.Entity.OneId == 1 - || e.Entity.TwoId == 1 + e.Entity.OneId == oneId + || e.Entity.TwoId == twoId ? EntityState.Deleted : EntityState.Unchanged, e.State)); @@ -3011,24 +3681,26 @@ public virtual void Can_delete_with_many_to_many() ValidateNavigations(ones, twos); - Assert.DoesNotContain(context.ChangeTracker.Entries(), e => e.Entity.OneId == 1 || e.Entity.TwoId == 1); + Assert.DoesNotContain( + context.ChangeTracker.Entries(), e => e.Entity.OneId == oneId || e.Entity.TwoId == twoId); }, context => { - var ones = context.Set().Include(e => e.TwoSkip).OrderBy(e => e.Id).ToList(); - var twos = context.Set().Include(e => e.OneSkip).ToList(); + var ones = context.Set().Include(e => e.TwoSkip).OrderBy(e => e.Name).ToList(); + var twos = context.Set().Include(e => e.OneSkip).OrderBy(e => e.Name).ToList(); ValidateNavigations(ones, twos); - Assert.DoesNotContain(context.ChangeTracker.Entries(), e => e.Entity.OneId == 1 || e.Entity.TwoId == 1); + Assert.DoesNotContain( + context.ChangeTracker.Entries(), e => e.Entity.OneId == oneId || e.Entity.TwoId == twoId); }); - static void ValidateNavigations(List ones, List twos) + void ValidateNavigations(List ones, List twos) { foreach (var one in ones) { if (one.TwoSkip != null) { - Assert.DoesNotContain(one.TwoSkip, e => e.Id == 1); + Assert.DoesNotContain(one.TwoSkip, e => e.Id == twoId); } } @@ -3036,7 +3708,7 @@ static void ValidateNavigations(List ones, List twos) { if (two.OneSkip != null) { - Assert.DoesNotContain(two.OneSkip, e => e.Id == 1); + Assert.DoesNotContain(two.OneSkip, e => e.Id == oneId); } } } @@ -3047,20 +3719,22 @@ static void ValidateNavigations(List ones, List twos) [InlineData(true)] public virtual async Task Can_insert_many_to_many_fully_by_convention(bool async) { + List keys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { var leftEntities = new[] { - context.Set().CreateInstance((e, p) => e.Id = 7711), - context.Set().CreateInstance((e, p) => e.Id = 7712), - context.Set().CreateInstance((e, p) => e.Id = 7713) + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7711), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7712), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7713) }; var rightEntities = new[] { - context.Set().CreateInstance((e, p) => e.Id = 7721), - context.Set().CreateInstance((e, p) => e.Id = 7722), - context.Set().CreateInstance((e, p) => e.Id = 7723) + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].Bs.Add(rightEntities[0]); // 11 - 21 @@ -3094,10 +3768,12 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities); + + keys = leftEntities.Select(e => e.Id).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Id > 7700).Include(e => e.Bs); + var queryable = context.Set().Where(e => keys.Contains(e.Id)).Include(e => e.Bs); var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(3, results.Count); @@ -3106,9 +3782,9 @@ await ExecuteWithStrategyInTransactionAsync( Assert.Equal(3, context.ChangeTracker.Entries().Count()); Assert.Equal(5, context.ChangeTracker.Entries>().Count()); - var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id) + var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name) .ToList(); - var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id) + var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name) .ToList(); Assert.Equal(3, leftEntities[0].Bs.Count); @@ -3201,9 +3877,9 @@ await ExecuteWithStrategyInTransactionAsync( Assert.Equal(3, context.ChangeTracker.Entries().Count()); Assert.Equal(5, context.ChangeTracker.Entries>().Count()); - var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id) + var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name) .ToList(); - var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id) + var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name) .ToList(); Assert.Equal(3, leftEntities[0].Rights.Count); @@ -3353,9 +4029,9 @@ await ExecuteWithStrategyInTransactionAsync( Assert.Equal(3, context.ChangeTracker.Entries().Count()); Assert.Equal(5, context.ChangeTracker.Entries>().Count()); - var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id) + var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name) .ToList(); - var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id) + var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name) .ToList(); Assert.Equal(3, leftEntities[0].Rights.Count); @@ -3389,20 +4065,22 @@ static void ValidateFixup(DbContext context, IList leftEntiti [InlineData(true)] public virtual async Task Initial_tracking_uses_skip_navigations(bool async) { + List keys = null; + await ExecuteWithStrategyInTransactionAsync( async context => { var leftEntities = new[] { - context.Set().CreateInstance((e, p) => e.Id = 7711), - context.Set().CreateInstance((e, p) => e.Id = 7712), - context.Set().CreateInstance((e, p) => e.Id = 7713) + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7711), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7712), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7713) }; var rightEntities = new[] { - context.Set().CreateInstance((e, p) => e.Id = 7721), - context.Set().CreateInstance((e, p) => e.Id = 7722), - context.Set().CreateInstance((e, p) => e.Id = 7723) + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7721), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7722), + context.Set().CreateInstance((e, p) => e.Id = Fixture.UseGeneratedKeys ? 0 : 7723) }; leftEntities[0].Bs.Add(rightEntities[0]); // 11 - 21 @@ -3430,16 +4108,18 @@ await ExecuteWithStrategyInTransactionAsync( } ValidateFixup(context, leftEntities, rightEntities); + + keys = leftEntities.Select(e => e.Id).ToList(); }, async context => { - var queryable = context.Set().Where(e => e.Id > 7700).Include(e => e.Bs); + var queryable = context.Set().Where(e => keys.Contains(e.Id)).Include(e => e.Bs); var results = async ? await queryable.ToListAsync() : queryable.ToList(); Assert.Equal(3, results.Count); - var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id) + var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name) .ToList(); - var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id) + var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name) .ToList(); ValidateFixup(context, leftEntities, rightEntities); @@ -3490,8 +4170,8 @@ public virtual void Can_load_entities_in_any_order(int[] order) Assert.Equal(20, context.ChangeTracker.Entries().Count()); Assert.Equal(112, context.ChangeTracker.Entries().Count()); - var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); - var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Id).ToList(); + var leftEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); + var rightEntities = context.ChangeTracker.Entries().Select(e => e.Entity).OrderBy(e => e.Name).ToList(); var joinCount = 0; foreach (var left in leftEntities) @@ -3566,23 +4246,27 @@ public virtual void Can_insert_update_delete_shared_type_entity_type() [ConditionalFact] public virtual void Can_insert_update_delete_proxyable_shared_type_entity_type() { + var id = 0; + ExecuteWithStrategyInTransaction( context => { var entity = context.Set("PST").CreateInstance( (e, p) => { - e["Id"] = 1; + e["Id"] = Fixture.UseGeneratedKeys ? null : 1; e["Payload"] = "NewlyAdded"; }); context.Set("PST").Add(entity); context.SaveChanges(); + + id = (int)entity["Id"]; }, context => { - var entity = context.Set("PST").Single(e => (int)e["Id"] == 1); + var entity = context.Set("PST").Single(e => (int)e["Id"] == id); Assert.Equal("NewlyAdded", (string)entity["Payload"]); @@ -3597,7 +4281,7 @@ public virtual void Can_insert_update_delete_proxyable_shared_type_entity_type() }, context => { - var entity = context.Set("PST").Single(e => (int)e["Id"] == 1); + var entity = context.Set("PST").Single(e => (int)e["Id"] == id); Assert.Equal("AlreadyUpdated", (string)entity["Payload"]); @@ -3605,7 +4289,7 @@ public virtual void Can_insert_update_delete_proxyable_shared_type_entity_type() context.SaveChanges(); - Assert.False(context.Set("PST").Any(e => (int)e["Id"] == 1)); + Assert.False(context.Set("PST").Any(e => (int)e["Id"] == id)); }); } diff --git a/test/EFCore.Specification.Tests/Query/ManyToManyQueryFixtureBase.cs b/test/EFCore.Specification.Tests/Query/ManyToManyQueryFixtureBase.cs index aac3a89a346..b6dd2b209e6 100644 --- a/test/EFCore.Specification.Tests/Query/ManyToManyQueryFixtureBase.cs +++ b/test/EFCore.Specification.Tests/Query/ManyToManyQueryFixtureBase.cs @@ -17,8 +17,20 @@ public abstract class ManyToManyQueryFixtureBase : SharedStoreFixtureBase GetContextCreator() => () => CreateContext(); + private ManyToManyData _data; + public ISetSource GetExpectedData() - => new ManyToManyData(); + { + if (_data == null) + { + using var context = CreateContext(); + _data = new ManyToManyData(context, false); + context.ChangeTracker.DetectChanges(); + context.ChangeTracker.Clear(); + } + + return _data; + } public IReadOnlyDictionary GetEntitySorters() => new Dictionary> @@ -329,7 +341,13 @@ protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext con }); } + public virtual bool UseGeneratedKeys + => false; + protected override void Seed(ManyToManyContext context) - => ManyToManyContext.Seed(context); + { + new ManyToManyData(context, UseGeneratedKeys); + context.SaveChanges(); + } } } diff --git a/test/EFCore.Specification.Tests/TestModels/ManyToManyModel/ManyToManyContext.cs b/test/EFCore.Specification.Tests/TestModels/ManyToManyModel/ManyToManyContext.cs index 30a213d73d5..7f0fc194109 100644 --- a/test/EFCore.Specification.Tests/TestModels/ManyToManyModel/ManyToManyContext.cs +++ b/test/EFCore.Specification.Tests/TestModels/ManyToManyModel/ManyToManyContext.cs @@ -24,9 +24,6 @@ public ManyToManyContext(DbContextOptions options) public DbSet ImplicitManyToManyBs { get; set; } public DbSet GeneratedKeysLefts { get; set; } public DbSet GeneratedKeysRights { get; set; } - - public static void Seed(ManyToManyContext context) - => ManyToManyData.Seed(context); } public static class ManyToManyContextExtensions diff --git a/test/EFCore.Specification.Tests/TestModels/ManyToManyModel/ManyToManyData.cs b/test/EFCore.Specification.Tests/TestModels/ManyToManyModel/ManyToManyData.cs index dea6a4de0b6..0143ee0bb6b 100644 --- a/test/EFCore.Specification.Tests/TestModels/ManyToManyModel/ManyToManyData.cs +++ b/test/EFCore.Specification.Tests/TestModels/ManyToManyModel/ManyToManyData.cs @@ -11,217 +11,42 @@ namespace Microsoft.EntityFrameworkCore.TestModels.ManyToManyModel { public class ManyToManyData : ISetSource { + private readonly bool _useGeneratedKeys; private readonly EntityOne[] _ones; private readonly EntityTwo[] _twos; private readonly EntityThree[] _threes; private readonly EntityCompositeKey[] _compositeKeys; private readonly EntityRoot[] _roots; - private readonly JoinCompositeKeyToLeaf[] _joinCompositeKeyToLeaves; - private readonly JoinOneSelfPayload[] _joinOneSelfPayloads; - private readonly JoinOneToBranch[] _joinOneToBranches; - private readonly JoinOneToThreePayloadFull[] _joinOneToThreePayloadFulls; - private readonly JoinOneToTwo[] _joinOneToTwos; - private readonly JoinThreeToCompositeKeyFull[] _joinThreeToCompositeKeyFulls; - private readonly JoinTwoToThree[] _joinTwoToThrees; - - private readonly Dictionary[] _joinOneToTwoShareds; - private readonly Dictionary[] _joinOneToThreePayloadFullShareds; - private readonly Dictionary[] _joinTwoSelfShareds; - private readonly Dictionary[] _joinTwoToCompositeKeyShareds; - private readonly Dictionary[] _joinThreeToRootShareds; - private readonly Dictionary[] _joinCompositeKeyToRootShareds; - - public ManyToManyData() + public ManyToManyData(ManyToManyContext context, bool useGeneratedKeys) { - _ones = CreateOnes(null); - _twos = CreateTwos(null); - _threes = CreateThrees(null); - _compositeKeys = CreateCompositeKeys(null); - _roots = CreateRoots(null); - - _joinCompositeKeyToLeaves = CreateJoinCompositeKeyToLeaves(null); - _joinOneSelfPayloads = CreateJoinOneSelfPayloads(null); - _joinOneToBranches = CreateJoinOneToBranches(null); - _joinOneToThreePayloadFulls = CreateJoinOneToThreePayloadFulls(null); - _joinOneToTwos = CreateJoinOneToTwos(null); - _joinThreeToCompositeKeyFulls = CreateJoinThreeToCompositeKeyFulls(null); - _joinTwoToThrees = CreateJoinTwoToThrees(null); - - _joinOneToTwoShareds = CreateEntityOneEntityTwos(null); - _joinOneToThreePayloadFullShareds = CreateJoinOneToThreePayloadFullShareds(null); - _joinTwoSelfShareds = CreateJoinTwoSelfShareds(null); - _joinTwoToCompositeKeyShareds = CreateJoinTwoToCompositeKeyShareds(null); - _joinThreeToRootShareds = CreateEntityRootEntityThrees(null); - _joinCompositeKeyToRootShareds = CreateJoinCompositeKeyToRootShareds(null); - - foreach (var basicTwo in _twos) - { - var collectionOne = _ones.FirstOrDefault(o => o.Id == basicTwo.CollectionInverseId); - basicTwo.CollectionInverse = collectionOne; - collectionOne?.Collection.Add(basicTwo); - - var referenceOne = _ones.FirstOrDefault(o => o.Id == basicTwo.ReferenceInverseId); - basicTwo.ReferenceInverse = referenceOne; - if (referenceOne != null) - { - referenceOne.Reference = basicTwo; - } - } - - foreach (var basicThree in _threes) - { - var collectionTwo = _twos.FirstOrDefault(o => o.Id == basicThree.CollectionInverseId); - basicThree.CollectionInverse = collectionTwo; - collectionTwo?.Collection.Add(basicThree); - - var referenceTwo = _twos.FirstOrDefault(o => o.Id == basicThree.ReferenceInverseId); - basicThree.ReferenceInverse = referenceTwo; - if (referenceTwo != null) - { - referenceTwo.Reference = basicThree; - } - } - - // Join entities - foreach (var joinEntity in _joinOneToTwos) - { - var one = _ones.First(o => o.Id == joinEntity.OneId); - var two = _twos.First(t => t.Id == joinEntity.TwoId); - one.TwoSkip.Add(two); - two.OneSkip.Add(one); - } - - foreach (var joinEntity in _joinOneToThreePayloadFulls) - { - var one = _ones.First(o => o.Id == joinEntity.OneId); - var three = _threes.First(t => t.Id == joinEntity.ThreeId); - one.ThreeSkipPayloadFull.Add(three); - one.JoinThreePayloadFull.Add(joinEntity); - three.OneSkipPayloadFull.Add(one); - three.JoinOnePayloadFull.Add(joinEntity); - joinEntity.One = one; - joinEntity.Three = three; - } - - foreach (var joinEntity in _joinOneSelfPayloads) - { - var left = _ones.First(o => o.Id == joinEntity.LeftId); - var right = _ones.First(t => t.Id == joinEntity.RightId); - left.SelfSkipPayloadRight.Add(right); - left.JoinSelfPayloadRight.Add(joinEntity); - right.SelfSkipPayloadLeft.Add(left); - right.JoinSelfPayloadLeft.Add(joinEntity); - joinEntity.Left = left; - joinEntity.Right = right; - } - - foreach (var joinEntity in _joinOneToBranches) - { - var one = _ones.First(o => o.Id == joinEntity.EntityOneId); - var branch = _roots.OfType().First(t => t.Id == joinEntity.EntityBranchId); - one.BranchSkip.Add(branch); - branch.OneSkip.Add(one); - } - - foreach (var joinEntity in _joinTwoToThrees) - { - var two = _twos.First(o => o.Id == joinEntity.TwoId); - var three = _threes.First(t => t.Id == joinEntity.ThreeId); - two.ThreeSkipFull.Add(three); - two.JoinThreeFull.Add(joinEntity); - three.TwoSkipFull.Add(two); - three.JoinTwoFull.Add(joinEntity); - joinEntity.Two = two; - joinEntity.Three = three; - } - - foreach (var joinEntity in _joinThreeToCompositeKeyFulls) - { - var compositeKey = _compositeKeys.First( - o => o.Key1 == joinEntity.CompositeId1 - && o.Key2 == joinEntity.CompositeId2 - && o.Key3 == joinEntity.CompositeId3); - var three = _threes.First(t => t.Id == joinEntity.ThreeId); - compositeKey.ThreeSkipFull.Add(three); - compositeKey.JoinThreeFull.Add(joinEntity); - three.CompositeKeySkipFull.Add(compositeKey); - three.JoinCompositeKeyFull.Add(joinEntity); - joinEntity.Composite = compositeKey; - joinEntity.Three = three; - } - - foreach (var joinEntity in _joinCompositeKeyToLeaves) - { - var compositeKey = _compositeKeys.First( - o => o.Key1 == joinEntity.CompositeId1 - && o.Key2 == joinEntity.CompositeId2 - && o.Key3 == joinEntity.CompositeId3); - var leaf = _roots.OfType().First(t => t.Id == joinEntity.LeafId); - compositeKey.LeafSkipFull.Add(leaf); - compositeKey.JoinLeafFull.Add(joinEntity); - leaf.CompositeKeySkipFull.Add(compositeKey); - leaf.JoinCompositeKeyFull.Add(joinEntity); - joinEntity.Composite = compositeKey; - joinEntity.Leaf = leaf; - } - - // Shared join entities - foreach (var joinEntity in _joinOneToTwoShareds) - { - var one = _ones.First(o => o.Id == (int)joinEntity["EntityOneId"]); - var two = _twos.First(t => t.Id == (int)joinEntity["EntityTwoId"]); - one.TwoSkipShared.Add(two); - two.OneSkipShared.Add(one); - } - - foreach (var joinEntity in _joinOneToThreePayloadFullShareds) - { - var one = _ones.First(o => o.Id == (int)joinEntity["OneId"]); - var three = _threes.First(t => t.Id == (int)joinEntity["ThreeId"]); - one.ThreeSkipPayloadFullShared.Add(three); - one.JoinThreePayloadFullShared.Add(joinEntity); - three.OneSkipPayloadFullShared.Add(one); - three.JoinOnePayloadFullShared.Add(joinEntity); - } - - foreach (var joinEntity in _joinTwoSelfShareds) - { - var left = _twos.First(o => o.Id == (int)joinEntity["LeftId"]); - var right = _twos.First(t => t.Id == (int)joinEntity["RightId"]); - left.SelfSkipSharedRight.Add(right); - right.SelfSkipSharedLeft.Add(left); - } + _useGeneratedKeys = useGeneratedKeys; + _ones = CreateOnes(context); + context.Set().AddRange(_ones); + _twos = CreateTwos(context); + context.Set().AddRange(_twos); + _threes = CreateThrees(context); + context.Set().AddRange(_threes); + _compositeKeys = CreateCompositeKeys(context); + context.Set().AddRange(_compositeKeys); + _roots = CreateRoots(context); + context.Set().AddRange(_roots); - foreach (var joinEntity in _joinTwoToCompositeKeyShareds) - { - var compositeKey = _compositeKeys.First( - o => o.Key1 == (int)joinEntity["CompositeId1"] - && o.Key2 == (string)joinEntity["CompositeId2"] - && o.Key3 == (DateTime)joinEntity["CompositeId3"]); - var two = _twos.First(t => t.Id == (int)joinEntity["TwoId"]); - compositeKey.TwoSkipShared.Add(two); - two.CompositeKeySkipShared.Add(compositeKey); - } - - foreach (var joinEntity in _joinThreeToRootShareds) - { - var three = _threes.First(o => o.Id == (int)joinEntity["EntityThreeId"]); - var root = _roots.First(t => t.Id == (int)joinEntity["EntityRootId"]); - three.RootSkipShared.Add(root); - root.ThreeSkipShared.Add(three); - } + context.Set().AddRange(CreateJoinCompositeKeyToLeaves(context)); + context.Set().AddRange(CreateJoinOneSelfPayloads(context)); + context.Set().AddRange(CreateJoinOneToBranches(context)); + context.Set().AddRange(CreateJoinOneToThreePayloadFulls(context)); + context.Set().AddRange(CreateJoinOneToTwos(context)); + context.Set().AddRange(CreateJoinThreeToCompositeKeyFulls(context)); + context.Set().AddRange(CreateJoinTwoToThrees(context)); - foreach (var joinEntity in _joinCompositeKeyToRootShareds) - { - var compositeKey = _compositeKeys.First( - o => o.Key1 == (int)joinEntity["CompositeId1"] - && o.Key2 == (string)joinEntity["CompositeId2"] - && o.Key3 == (DateTime)joinEntity["CompositeId3"]); - var root = _roots.First(t => t.Id == (int)joinEntity["RootId"]); - compositeKey.RootSkipShared.Add(root); - root.CompositeKeySkipShared.Add(compositeKey); - } + context.Set>("EntityOneEntityTwo").AddRange(CreateEntityOneEntityTwos(context)); + context.Set>("JoinOneToThreePayloadFullShared") + .AddRange(CreateJoinOneToThreePayloadFullShareds(context)); + context.Set>("JoinTwoSelfShared").AddRange(CreateJoinTwoSelfShareds(context)); + context.Set>("JoinTwoToCompositeKeyShared").AddRange(CreateJoinTwoToCompositeKeyShareds(context)); + context.Set>("EntityRootEntityThree").AddRange(CreateEntityRootEntityThrees(context)); + context.Set>("JoinCompositeKeyToRootShared").AddRange(CreateJoinCompositeKeyToRootShareds(context)); } public IQueryable Set() @@ -265,56 +90,29 @@ public IQueryable Set() throw new InvalidOperationException("Invalid entity type: " + typeof(TEntity)); } - public static void Seed(ManyToManyContext context) - { - context.Set().AddRange(CreateOnes(context)); - context.Set().AddRange(CreateTwos(context)); - context.Set().AddRange(CreateThrees(context)); - context.Set().AddRange(CreateCompositeKeys(context)); - context.Set().AddRange(CreateRoots(context)); - - context.Set().AddRange(CreateJoinCompositeKeyToLeaves(context)); - context.Set().AddRange(CreateJoinOneSelfPayloads(context)); - context.Set().AddRange(CreateJoinOneToBranches(context)); - context.Set().AddRange(CreateJoinOneToThreePayloadFulls(context)); - context.Set().AddRange(CreateJoinOneToTwos(context)); - context.Set().AddRange(CreateJoinThreeToCompositeKeyFulls(context)); - context.Set().AddRange(CreateJoinTwoToThrees(context)); - - context.Set>("EntityOneEntityTwo").AddRange(CreateEntityOneEntityTwos(context)); - context.Set>("JoinOneToThreePayloadFullShared") - .AddRange(CreateJoinOneToThreePayloadFullShareds(context)); - context.Set>("JoinTwoSelfShared").AddRange(CreateJoinTwoSelfShareds(context)); - context.Set>("JoinTwoToCompositeKeyShared").AddRange(CreateJoinTwoToCompositeKeyShareds(context)); - context.Set>("EntityRootEntityThree").AddRange(CreateEntityRootEntityThrees(context)); - context.Set>("JoinCompositeKeyToRootShared").AddRange(CreateJoinCompositeKeyToRootShareds(context)); - - context.SaveChanges(); - } - - private static EntityOne[] CreateOnes(ManyToManyContext context) + private EntityOne[] CreateOnes(ManyToManyContext context) => new[] { - CreateEntityOne(context, 1, "EntityOne 1"), - CreateEntityOne(context, 2, "EntityOne 2"), - CreateEntityOne(context, 3, "EntityOne 3"), - CreateEntityOne(context, 4, "EntityOne 4"), - CreateEntityOne(context, 5, "EntityOne 5"), - CreateEntityOne(context, 6, "EntityOne 6"), - CreateEntityOne(context, 7, "EntityOne 7"), - CreateEntityOne(context, 8, "EntityOne 8"), - CreateEntityOne(context, 9, "EntityOne 9"), - CreateEntityOne(context, 10, "EntityOne 10"), - CreateEntityOne(context, 11, "EntityOne 11"), - CreateEntityOne(context, 12, "EntityOne 12"), - CreateEntityOne(context, 13, "EntityOne 13"), - CreateEntityOne(context, 14, "EntityOne 14"), - CreateEntityOne(context, 15, "EntityOne 15"), - CreateEntityOne(context, 16, "EntityOne 16"), - CreateEntityOne(context, 17, "EntityOne 17"), - CreateEntityOne(context, 18, "EntityOne 18"), - CreateEntityOne(context, 19, "EntityOne 19"), - CreateEntityOne(context, 20, "EntityOne 20"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 1, "EntityOne 1"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 2, "EntityOne 2"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 3, "EntityOne 3"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 4, "EntityOne 4"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 5, "EntityOne 5"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 6, "EntityOne 6"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 7, "EntityOne 7"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 8, "EntityOne 8"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 9, "EntityOne 9"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 10, "EntityOne 10"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 11, "EntityOne 11"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 12, "EntityOne 12"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 13, "EntityOne 13"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 14, "EntityOne 14"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 15, "EntityOne 15"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 16, "EntityOne 16"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 17, "EntityOne 17"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 18, "EntityOne 18"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 19, "EntityOne 19"), + CreateEntityOne(context, _useGeneratedKeys ? 0 : 20, "EntityOne 20"), }; private static EntityOne CreateEntityOne(ManyToManyContext context, int id, string name) @@ -337,44 +135,44 @@ private static EntityOne CreateEntityOne(ManyToManyContext context, int id, stri e.BranchSkip = CreateCollection(p); }); - private static EntityTwo[] CreateTwos(ManyToManyContext context) + private EntityTwo[] CreateTwos(ManyToManyContext context) => new[] { - CreateEntityTwo(context, 1, "EntityTwo 1", null, 1), - CreateEntityTwo(context, 2, "EntityTwo 2", null, 1), - CreateEntityTwo(context, 3, "EntityTwo 3", null, null), - CreateEntityTwo(context, 4, "EntityTwo 4", null, 3), - CreateEntityTwo(context, 5, "EntityTwo 5", null, 3), - CreateEntityTwo(context, 6, "EntityTwo 6", null, 5), - CreateEntityTwo(context, 7, "EntityTwo 7", null, 5), - CreateEntityTwo(context, 8, "EntityTwo 8", null, 7), - CreateEntityTwo(context, 9, "EntityTwo 9", null, 7), - CreateEntityTwo(context, 10, "EntityTwo 10", 20, 9), - CreateEntityTwo(context, 11, "EntityTwo 11", 18, 9), - CreateEntityTwo(context, 12, "EntityTwo 12", 16, 11), - CreateEntityTwo(context, 13, "EntityTwo 13", 14, 11), - CreateEntityTwo(context, 14, "EntityTwo 14", 12, 13), - CreateEntityTwo(context, 15, "EntityTwo 15", 11, 13), - CreateEntityTwo(context, 16, "EntityTwo 16", 9, 15), - CreateEntityTwo(context, 17, "EntityTwo 17", 7, 15), - CreateEntityTwo(context, 18, "EntityTwo 18", 5, 16), - CreateEntityTwo(context, 19, "EntityTwo 19", 3, 16), - CreateEntityTwo(context, 20, "EntityTwo 20", 1, 17), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 1, "EntityTwo 1", null, _ones[0]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 2, "EntityTwo 2", null, _ones[0]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 3, "EntityTwo 3", null, null), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 4, "EntityTwo 4", null, _ones[2]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 5, "EntityTwo 5", null, _ones[2]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 6, "EntityTwo 6", null, _ones[4]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 7, "EntityTwo 7", null, _ones[4]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 8, "EntityTwo 8", null, _ones[6]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 9, "EntityTwo 9", null, _ones[6]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 10, "EntityTwo 10", _ones[19], _ones[8]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 11, "EntityTwo 11", _ones[17], _ones[8]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 12, "EntityTwo 12", _ones[15], _ones[10]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 13, "EntityTwo 13", _ones[13], _ones[10]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 14, "EntityTwo 14", _ones[11], _ones[12]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 15, "EntityTwo 15", _ones[10], _ones[12]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 16, "EntityTwo 16", _ones[8], _ones[14]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 17, "EntityTwo 17", _ones[6], _ones[14]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 18, "EntityTwo 18", _ones[4], _ones[15]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 19, "EntityTwo 19", _ones[2], _ones[15]), + CreateEntityTwo(context, _useGeneratedKeys ? 0 : 20, "EntityTwo 20", _ones[0], _ones[16]), }; private static EntityTwo CreateEntityTwo( ManyToManyContext context, int id, string name, - int? referenceInverseId, - int? collectionInverseId) + EntityOne referenceInverse, + EntityOne collectionInverse) => CreateInstance( context?.EntityTwos, (e, p) => { e.Id = id; e.Name = name; - e.ReferenceInverseId = referenceInverseId; - e.CollectionInverseId = collectionInverseId; + e.ReferenceInverse = referenceInverse; + e.CollectionInverse = collectionInverse; e.Collection = CreateCollection(p); e.OneSkip = CreateCollection(p); e.ThreeSkipFull = CreateCollection(p); @@ -385,44 +183,44 @@ private static EntityTwo CreateEntityTwo( e.CompositeKeySkipShared = CreateCollection(p); }); - private static EntityThree[] CreateThrees(ManyToManyContext context) + private EntityThree[] CreateThrees(ManyToManyContext context) => new[] { - CreateEntityThree(context, 1, "EntityThree 1", null, null), - CreateEntityThree(context, 2, "EntityThree 2", 19, 17), - CreateEntityThree(context, 3, "EntityThree 3", 2, 16), - CreateEntityThree(context, 4, "EntityThree 4", 20, 16), - CreateEntityThree(context, 5, "EntityThree 5", 4, 15), - CreateEntityThree(context, 6, "EntityThree 6", null, 15), - CreateEntityThree(context, 7, "EntityThree 7", 6, 13), - CreateEntityThree(context, 8, "EntityThree 8", null, 13), - CreateEntityThree(context, 9, "EntityThree 9", 8, 11), - CreateEntityThree(context, 10, "EntityThree 10", null, 11), - CreateEntityThree(context, 11, "EntityThree 11", 19, 9), - CreateEntityThree(context, 12, "EntityThree 12", null, 9), - CreateEntityThree(context, 13, "EntityThree 13", 12, 7), - CreateEntityThree(context, 14, "EntityThree 14", null, 7), - CreateEntityThree(context, 15, "EntityThree 15", 14, 5), - CreateEntityThree(context, 16, "EntityThree 16", null, 5), - CreateEntityThree(context, 17, "EntityThree 17", 16, 3), - CreateEntityThree(context, 18, "EntityThree 18", null, 3), - CreateEntityThree(context, 19, "EntityThree 19", 18, 1), - CreateEntityThree(context, 20, "EntityThree 20", null, 1), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 1, "EntityThree 1", null, null), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 2, "EntityThree 2", _twos[18], _twos[16]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 3, "EntityThree 3", _twos[1], _twos[15]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 4, "EntityThree 4", _twos[19], _twos[15]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 5, "EntityThree 5", _twos[3], _twos[14]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 6, "EntityThree 6", null, _twos[14]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 7, "EntityThree 7", _twos[5], _twos[12]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 8, "EntityThree 8", null, _twos[12]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 9, "EntityThree 9", _twos[7], _twos[10]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 10, "EntityThree 10", null, _twos[10]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 11, "EntityThree 11", _twos[18], _twos[8]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 12, "EntityThree 12", null, _twos[8]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 13, "EntityThree 13", _twos[11], _twos[6]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 14, "EntityThree 14", null, _twos[6]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 15, "EntityThree 15", _twos[13], _twos[4]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 16, "EntityThree 16", null, _twos[4]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 17, "EntityThree 17", _twos[15], _twos[2]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 18, "EntityThree 18", null, _twos[2]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 19, "EntityThree 19", _twos[17], _twos[0]), + CreateEntityThree(context, _useGeneratedKeys ? 0 : 20, "EntityThree 20", null, _twos[0]), }; private static EntityThree CreateEntityThree( ManyToManyContext context, int id, string name, - int? referenceInverseId, - int? collectionInverseId) + EntityTwo referenceInverse, + EntityTwo collectionInverse) => CreateInstance( context?.EntityThrees, (e, p) => { e.Id = id; e.Name = name; - e.ReferenceInverseId = referenceInverseId; - e.CollectionInverseId = collectionInverseId; + e.ReferenceInverse = referenceInverse; + e.CollectionInverse = collectionInverse; e.OneSkipPayloadFull = CreateCollection(p); e.JoinOnePayloadFull = CreateCollection(p); e.TwoSkipFull = CreateCollection(p); @@ -434,29 +232,29 @@ private static EntityThree CreateEntityThree( e.RootSkipShared = CreateCollection(p); }); - private static EntityCompositeKey[] CreateCompositeKeys(ManyToManyContext context) + private EntityCompositeKey[] CreateCompositeKeys(ManyToManyContext context) => new[] { - CreateEntityCompositeKey(context, 1, "1_1", new DateTime(2001, 1, 1), "Composite 1"), - CreateEntityCompositeKey(context, 1, "1_2", new DateTime(2001, 2, 1), "Composite 2"), - CreateEntityCompositeKey(context, 3, "3_1", new DateTime(2003, 1, 1), "Composite 3"), - CreateEntityCompositeKey(context, 3, "3_2", new DateTime(2003, 2, 1), "Composite 4"), - CreateEntityCompositeKey(context, 3, "3_3", new DateTime(2003, 3, 1), "Composite 5"), - CreateEntityCompositeKey(context, 6, "6_1", new DateTime(2006, 1, 1), "Composite 6"), - CreateEntityCompositeKey(context, 7, "7_1", new DateTime(2007, 1, 1), "Composite 7"), - CreateEntityCompositeKey(context, 7, "7_2", new DateTime(2007, 2, 1), "Composite 8"), - CreateEntityCompositeKey(context, 8, "8_1", new DateTime(2008, 1, 1), "Composite 9"), - CreateEntityCompositeKey(context, 8, "8_2", new DateTime(2008, 2, 1), "Composite 10"), - CreateEntityCompositeKey(context, 8, "8_3", new DateTime(2008, 3, 1), "Composite 11"), - CreateEntityCompositeKey(context, 8, "8_4", new DateTime(2008, 4, 1), "Composite 12"), - CreateEntityCompositeKey(context, 8, "8_5", new DateTime(2008, 5, 1), "Composite 13"), - CreateEntityCompositeKey(context, 9, "9_1", new DateTime(2009, 1, 1), "Composite 14"), - CreateEntityCompositeKey(context, 9, "9_2", new DateTime(2009, 2, 1), "Composite 15"), - CreateEntityCompositeKey(context, 9, "9_3", new DateTime(2009, 3, 1), "Composite 16"), - CreateEntityCompositeKey(context, 9, "9_4", new DateTime(2009, 4, 1), "Composite 17"), - CreateEntityCompositeKey(context, 9, "9_5", new DateTime(2009, 5, 1), "Composite 18"), - CreateEntityCompositeKey(context, 9, "9_6", new DateTime(2009, 6, 1), "Composite 19"), - CreateEntityCompositeKey(context, 9, "9_7", new DateTime(2009, 7, 1), "Composite 20") + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 1, "1_1", new DateTime(2001, 1, 1), "Composite 1"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 1, "1_2", new DateTime(2001, 2, 1), "Composite 2"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 3, "3_1", new DateTime(2003, 1, 1), "Composite 3"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 3, "3_2", new DateTime(2003, 2, 1), "Composite 4"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 3, "3_3", new DateTime(2003, 3, 1), "Composite 5"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 6, "6_1", new DateTime(2006, 1, 1), "Composite 6"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 7, "7_1", new DateTime(2007, 1, 1), "Composite 7"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 7, "7_2", new DateTime(2007, 2, 1), "Composite 8"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 8, "8_1", new DateTime(2008, 1, 1), "Composite 9"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 8, "8_2", new DateTime(2008, 2, 1), "Composite 10"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 8, "8_3", new DateTime(2008, 3, 1), "Composite 11"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 8, "8_4", new DateTime(2008, 4, 1), "Composite 12"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 8, "8_5", new DateTime(2008, 5, 1), "Composite 13"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 9, "9_1", new DateTime(2009, 1, 1), "Composite 14"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 9, "9_2", new DateTime(2009, 2, 1), "Composite 15"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 9, "9_3", new DateTime(2009, 3, 1), "Composite 16"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 9, "9_4", new DateTime(2009, 4, 1), "Composite 17"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 9, "9_5", new DateTime(2009, 5, 1), "Composite 18"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 9, "9_6", new DateTime(2009, 6, 1), "Composite 19"), + CreateEntityCompositeKey(context, _useGeneratedKeys ? 0 : 9, "9_7", new DateTime(2009, 7, 1), "Composite 20") }; private static EntityCompositeKey CreateEntityCompositeKey( @@ -480,29 +278,29 @@ private static EntityCompositeKey CreateEntityCompositeKey( e.JoinLeafFull = CreateCollection(p); }); - private static EntityRoot[] CreateRoots(ManyToManyContext context) + private EntityRoot[] CreateRoots(ManyToManyContext context) => new[] { - CreateEntityRoot(context, 1, "Root 1"), - CreateEntityRoot(context, 2, "Root 2"), - CreateEntityRoot(context, 3, "Root 3"), - CreateEntityRoot(context, 4, "Root 4"), - CreateEntityRoot(context, 5, "Root 5"), - CreateEntityRoot(context, 6, "Root 6"), - CreateEntityRoot(context, 7, "Root 7"), - CreateEntityRoot(context, 8, "Root 8"), - CreateEntityRoot(context, 9, "Root 9"), - CreateEntityRoot(context, 10, "Root 10"), - CreateEntityBranch(context, 11, "Branch 1", 7), - CreateEntityBranch(context, 12, "Branch 2", 77), - CreateEntityBranch(context, 13, "Branch 3", 777), - CreateEntityBranch(context, 14, "Branch 4", 7777), - CreateEntityBranch(context, 15, "Branch 5", 77777), - CreateEntityBranch(context, 16, "Branch 6", 777777), - CreateEntityLeaf(context, 21, "Leaf 1", 42, true), - CreateEntityLeaf(context, 22, "Leaf 2", 421, true), - CreateEntityLeaf(context, 23, "Leaf 3", 1337, false), - CreateEntityLeaf(context, 24, "Leaf 4", 1729, false) + CreateEntityRoot(context, _useGeneratedKeys ? 0 : 1, "Root 1"), + CreateEntityRoot(context, _useGeneratedKeys ? 0 : 2, "Root 2"), + CreateEntityRoot(context, _useGeneratedKeys ? 0 : 3, "Root 3"), + CreateEntityRoot(context, _useGeneratedKeys ? 0 : 4, "Root 4"), + CreateEntityRoot(context, _useGeneratedKeys ? 0 : 5, "Root 5"), + CreateEntityRoot(context, _useGeneratedKeys ? 0 : 6, "Root 6"), + CreateEntityRoot(context, _useGeneratedKeys ? 0 : 7, "Root 7"), + CreateEntityRoot(context, _useGeneratedKeys ? 0 : 8, "Root 8"), + CreateEntityRoot(context, _useGeneratedKeys ? 0 : 9, "Root 9"), + CreateEntityRoot(context, _useGeneratedKeys ? 0 : 10, "Root 10"), + CreateEntityBranch(context, _useGeneratedKeys ? 0 : 11, "Branch 1", 7), + CreateEntityBranch(context, _useGeneratedKeys ? 0 : 12, "Branch 2", 77), + CreateEntityBranch(context, _useGeneratedKeys ? 0 : 13, "Branch 3", 777), + CreateEntityBranch(context, _useGeneratedKeys ? 0 : 14, "Branch 4", 7777), + CreateEntityBranch(context, _useGeneratedKeys ? 0 : 15, "Branch 5", 77777), + CreateEntityBranch(context, _useGeneratedKeys ? 0 : 16, "Branch 6", 777777), + CreateEntityLeaf(context, _useGeneratedKeys ? 0 : 21, "Leaf 1", 42, true), + CreateEntityLeaf(context, _useGeneratedKeys ? 0 : 22, "Leaf 2", 421, true), + CreateEntityLeaf(context, _useGeneratedKeys ? 0 : 23, "Leaf 3", 1337, false), + CreateEntityLeaf(context, _useGeneratedKeys ? 0 : 24, "Leaf 4", 1729, false) }; private static EntityRoot CreateEntityRoot( @@ -554,873 +352,865 @@ private static EntityLeaf CreateEntityLeaf( e.JoinCompositeKeyFull = CreateCollection(p); }); - private static JoinCompositeKeyToLeaf[] CreateJoinCompositeKeyToLeaves(ManyToManyContext context) + private JoinCompositeKeyToLeaf[] CreateJoinCompositeKeyToLeaves(ManyToManyContext context) => new[] { - CreateJoinCompositeKeyToLeaf(context, 21, 1, "1_1", new DateTime(2001, 1, 1)), - CreateJoinCompositeKeyToLeaf(context, 21, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinCompositeKeyToLeaf(context, 23, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinCompositeKeyToLeaf(context, 22, 3, "3_1", new DateTime(2003, 1, 1)), - CreateJoinCompositeKeyToLeaf(context, 23, 3, "3_1", new DateTime(2003, 1, 1)), - CreateJoinCompositeKeyToLeaf(context, 24, 3, "3_2", new DateTime(2003, 2, 1)), - CreateJoinCompositeKeyToLeaf(context, 22, 3, "3_3", new DateTime(2003, 3, 1)), - CreateJoinCompositeKeyToLeaf(context, 21, 6, "6_1", new DateTime(2006, 1, 1)), - CreateJoinCompositeKeyToLeaf(context, 22, 7, "7_2", new DateTime(2007, 2, 1)), - CreateJoinCompositeKeyToLeaf(context, 24, 7, "7_2", new DateTime(2007, 2, 1)), - CreateJoinCompositeKeyToLeaf(context, 21, 8, "8_1", new DateTime(2008, 1, 1)), - CreateJoinCompositeKeyToLeaf(context, 23, 8, "8_2", new DateTime(2008, 2, 1)), - CreateJoinCompositeKeyToLeaf(context, 22, 8, "8_3", new DateTime(2008, 3, 1)), - CreateJoinCompositeKeyToLeaf(context, 23, 8, "8_3", new DateTime(2008, 3, 1)), - CreateJoinCompositeKeyToLeaf(context, 21, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinCompositeKeyToLeaf(context, 23, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinCompositeKeyToLeaf(context, 24, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinCompositeKeyToLeaf(context, 21, 9, "9_1", new DateTime(2009, 1, 1)), - CreateJoinCompositeKeyToLeaf(context, 22, 9, "9_1", new DateTime(2009, 1, 1)), - CreateJoinCompositeKeyToLeaf(context, 23, 9, "9_1", new DateTime(2009, 1, 1)), - CreateJoinCompositeKeyToLeaf(context, 21, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinCompositeKeyToLeaf(context, 22, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinCompositeKeyToLeaf(context, 21, 9, "9_3", new DateTime(2009, 3, 1)), - CreateJoinCompositeKeyToLeaf(context, 23, 9, "9_3", new DateTime(2009, 3, 1)), - CreateJoinCompositeKeyToLeaf(context, 24, 9, "9_3", new DateTime(2009, 3, 1)), - CreateJoinCompositeKeyToLeaf(context, 23, 9, "9_4", new DateTime(2009, 4, 1)), - CreateJoinCompositeKeyToLeaf(context, 24, 9, "9_4", new DateTime(2009, 4, 1)), - CreateJoinCompositeKeyToLeaf(context, 23, 9, "9_5", new DateTime(2009, 5, 1)), - CreateJoinCompositeKeyToLeaf(context, 24, 9, "9_5", new DateTime(2009, 5, 1)), - CreateJoinCompositeKeyToLeaf(context, 21, 9, "9_6", new DateTime(2009, 6, 1)), - CreateJoinCompositeKeyToLeaf(context, 22, 9, "9_6", new DateTime(2009, 6, 1)) + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[16], _compositeKeys[0]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[16], _compositeKeys[1]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[18], _compositeKeys[1]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[17], _compositeKeys[2]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[18], _compositeKeys[2]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[19], _compositeKeys[3]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[17], _compositeKeys[4]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[16], _compositeKeys[5]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[17], _compositeKeys[7]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[19], _compositeKeys[7]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[16], _compositeKeys[8]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[18], _compositeKeys[9]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[17], _compositeKeys[10]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[18], _compositeKeys[10]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[16], _compositeKeys[12]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[18], _compositeKeys[12]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[19], _compositeKeys[12]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[16], _compositeKeys[13]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[17], _compositeKeys[13]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[18], _compositeKeys[13]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[16], _compositeKeys[14]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[17], _compositeKeys[14]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[16], _compositeKeys[15]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[18], _compositeKeys[15]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[19], _compositeKeys[15]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[18], _compositeKeys[16]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[19], _compositeKeys[16]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[18], _compositeKeys[17]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[19], _compositeKeys[17]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[16], _compositeKeys[18]), + CreateJoinCompositeKeyToLeaf(context, (EntityLeaf)_roots[17], _compositeKeys[18]) }; private static JoinCompositeKeyToLeaf CreateJoinCompositeKeyToLeaf( ManyToManyContext context, - int leafId, - int compositeId1, - string compositeId2, - DateTime compositeId3) + EntityLeaf leaf, + EntityCompositeKey composite) => CreateInstance( context?.Set(), (e, p) => { - e.LeafId = leafId; - e.CompositeId1 = compositeId1; - e.CompositeId2 = compositeId2; - e.CompositeId3 = compositeId3; + e.Leaf = leaf; + e.Composite = composite; }); - private static JoinOneSelfPayload[] CreateJoinOneSelfPayloads(ManyToManyContext context) + private JoinOneSelfPayload[] CreateJoinOneSelfPayloads(ManyToManyContext context) => new[] { - CreateJoinOneSelfPayload(context, 3, 4, DateTime.Parse("2020-01-11 19:26:36")), - CreateJoinOneSelfPayload(context, 3, 6, DateTime.Parse("2005-10-03 12:57:54")), - CreateJoinOneSelfPayload(context, 3, 8, DateTime.Parse("2015-12-20 01:09:24")), - CreateJoinOneSelfPayload(context, 3, 18, DateTime.Parse("1999-12-26 02:51:57")), - CreateJoinOneSelfPayload(context, 3, 20, DateTime.Parse("2011-06-15 19:08:00")), - CreateJoinOneSelfPayload(context, 5, 3, DateTime.Parse("2019-12-08 05:40:16")), - CreateJoinOneSelfPayload(context, 5, 4, DateTime.Parse("2014-03-09 12:58:26")), - CreateJoinOneSelfPayload(context, 6, 5, DateTime.Parse("2014-05-15 16:34:38")), - CreateJoinOneSelfPayload(context, 6, 7, DateTime.Parse("2014-03-08 18:59:49")), - CreateJoinOneSelfPayload(context, 6, 13, DateTime.Parse("2013-12-10 07:01:53")), - CreateJoinOneSelfPayload(context, 7, 13, DateTime.Parse("2005-05-31 02:21:16")), - CreateJoinOneSelfPayload(context, 8, 9, DateTime.Parse("2011-12-31 19:37:25")), - CreateJoinOneSelfPayload(context, 8, 11, DateTime.Parse("2012-08-02 16:33:07")), - CreateJoinOneSelfPayload(context, 8, 12, DateTime.Parse("2018-07-19 09:10:12")), - CreateJoinOneSelfPayload(context, 10, 7, DateTime.Parse("2018-12-28 01:21:23")), - CreateJoinOneSelfPayload(context, 13, 2, DateTime.Parse("2014-03-22 02:20:06")), - CreateJoinOneSelfPayload(context, 13, 18, DateTime.Parse("2005-03-21 14:45:37")), - CreateJoinOneSelfPayload(context, 14, 9, DateTime.Parse("2016-06-26 08:03:32")), - CreateJoinOneSelfPayload(context, 15, 13, DateTime.Parse("2018-09-18 12:51:22")), - CreateJoinOneSelfPayload(context, 16, 5, DateTime.Parse("2016-12-17 14:20:25")), - CreateJoinOneSelfPayload(context, 16, 6, DateTime.Parse("2008-07-30 03:43:17")), - CreateJoinOneSelfPayload(context, 17, 14, DateTime.Parse("2019-08-01 16:26:31")), - CreateJoinOneSelfPayload(context, 19, 1, DateTime.Parse("2010-02-19 13:24:07")), - CreateJoinOneSelfPayload(context, 19, 8, DateTime.Parse("2004-07-28 09:06:02")), - CreateJoinOneSelfPayload(context, 19, 12, DateTime.Parse("2004-08-21 11:07:20")), - CreateJoinOneSelfPayload(context, 20, 1, DateTime.Parse("2014-11-21 18:13:02")), - CreateJoinOneSelfPayload(context, 20, 7, DateTime.Parse("2009-08-24 21:44:46")), - CreateJoinOneSelfPayload(context, 20, 14, DateTime.Parse("2013-02-18 02:19:19")), - CreateJoinOneSelfPayload(context, 20, 16, DateTime.Parse("2016-02-05 14:18:12")) + CreateJoinOneSelfPayload(context, _ones[2], _ones[3], DateTime.Parse("2020-01-11 19:26:36")), + CreateJoinOneSelfPayload(context, _ones[2], _ones[5], DateTime.Parse("2005-10-03 12:57:54")), + CreateJoinOneSelfPayload(context, _ones[2], _ones[7], DateTime.Parse("2015-12-20 01:09:24")), + CreateJoinOneSelfPayload(context, _ones[2], _ones[17], DateTime.Parse("1999-12-26 02:51:57")), + CreateJoinOneSelfPayload(context, _ones[2], _ones[19], DateTime.Parse("2011-06-15 19:08:00")), + CreateJoinOneSelfPayload(context, _ones[4], _ones[2], DateTime.Parse("2019-12-08 05:40:16")), + CreateJoinOneSelfPayload(context, _ones[4], _ones[3], DateTime.Parse("2014-03-09 12:58:26")), + CreateJoinOneSelfPayload(context, _ones[5], _ones[4], DateTime.Parse("2014-05-15 16:34:38")), + CreateJoinOneSelfPayload(context, _ones[5], _ones[6], DateTime.Parse("2014-03-08 18:59:49")), + CreateJoinOneSelfPayload(context, _ones[5], _ones[12], DateTime.Parse("2013-12-10 07:01:53")), + CreateJoinOneSelfPayload(context, _ones[6], _ones[12], DateTime.Parse("2005-05-31 02:21:16")), + CreateJoinOneSelfPayload(context, _ones[7], _ones[8], DateTime.Parse("2011-12-31 19:37:25")), + CreateJoinOneSelfPayload(context, _ones[7], _ones[10], DateTime.Parse("2012-08-02 16:33:07")), + CreateJoinOneSelfPayload(context, _ones[7], _ones[11], DateTime.Parse("2018-07-19 09:10:12")), + CreateJoinOneSelfPayload(context, _ones[9], _ones[6], DateTime.Parse("2018-12-28 01:21:23")), + CreateJoinOneSelfPayload(context, _ones[12], _ones[1], DateTime.Parse("2014-03-22 02:20:06")), + CreateJoinOneSelfPayload(context, _ones[12], _ones[17], DateTime.Parse("2005-03-21 14:45:37")), + CreateJoinOneSelfPayload(context, _ones[13], _ones[8], DateTime.Parse("2016-06-26 08:03:32")), + CreateJoinOneSelfPayload(context, _ones[14], _ones[12], DateTime.Parse("2018-09-18 12:51:22")), + CreateJoinOneSelfPayload(context, _ones[15], _ones[4], DateTime.Parse("2016-12-17 14:20:25")), + CreateJoinOneSelfPayload(context, _ones[15], _ones[5], DateTime.Parse("2008-07-30 03:43:17")), + CreateJoinOneSelfPayload(context, _ones[16], _ones[13], DateTime.Parse("2019-08-01 16:26:31")), + CreateJoinOneSelfPayload(context, _ones[18], _ones[0], DateTime.Parse("2010-02-19 13:24:07")), + CreateJoinOneSelfPayload(context, _ones[18], _ones[7], DateTime.Parse("2004-07-28 09:06:02")), + CreateJoinOneSelfPayload(context, _ones[18], _ones[11], DateTime.Parse("2004-08-21 11:07:20")), + CreateJoinOneSelfPayload(context, _ones[19], _ones[0], DateTime.Parse("2014-11-21 18:13:02")), + CreateJoinOneSelfPayload(context, _ones[19], _ones[6], DateTime.Parse("2009-08-24 21:44:46")), + CreateJoinOneSelfPayload(context, _ones[19], _ones[13], DateTime.Parse("2013-02-18 02:19:19")), + CreateJoinOneSelfPayload(context, _ones[19], _ones[15], DateTime.Parse("2016-02-05 14:18:12")) }; private static JoinOneSelfPayload CreateJoinOneSelfPayload( ManyToManyContext context, - int leftId, - int rightId, + EntityOne left, + EntityOne right, DateTime payload) => CreateInstance( context?.Set(), (e, p) => { - e.LeftId = leftId; - e.RightId = rightId; + e.Left = left; + e.Right = right; e.Payload = payload; }); - private static JoinOneToBranch[] CreateJoinOneToBranches(ManyToManyContext context) + private JoinOneToBranch[] CreateJoinOneToBranches(ManyToManyContext context) => new[] { - CreateJoinOneToBranch(context, 2, 16), - CreateJoinOneToBranch(context, 2, 24), - CreateJoinOneToBranch(context, 3, 14), - CreateJoinOneToBranch(context, 3, 16), - CreateJoinOneToBranch(context, 3, 22), - CreateJoinOneToBranch(context, 3, 24), - CreateJoinOneToBranch(context, 5, 13), - CreateJoinOneToBranch(context, 6, 16), - CreateJoinOneToBranch(context, 6, 22), - CreateJoinOneToBranch(context, 6, 23), - CreateJoinOneToBranch(context, 8, 11), - CreateJoinOneToBranch(context, 8, 12), - CreateJoinOneToBranch(context, 8, 13), - CreateJoinOneToBranch(context, 9, 11), - CreateJoinOneToBranch(context, 9, 12), - CreateJoinOneToBranch(context, 9, 14), - CreateJoinOneToBranch(context, 9, 16), - CreateJoinOneToBranch(context, 9, 21), - CreateJoinOneToBranch(context, 9, 24), - CreateJoinOneToBranch(context, 10, 12), - CreateJoinOneToBranch(context, 10, 13), - CreateJoinOneToBranch(context, 10, 14), - CreateJoinOneToBranch(context, 10, 21), - CreateJoinOneToBranch(context, 12, 11), - CreateJoinOneToBranch(context, 12, 12), - CreateJoinOneToBranch(context, 12, 14), - CreateJoinOneToBranch(context, 12, 23), - CreateJoinOneToBranch(context, 13, 15), - CreateJoinOneToBranch(context, 14, 12), - CreateJoinOneToBranch(context, 14, 14), - CreateJoinOneToBranch(context, 14, 16), - CreateJoinOneToBranch(context, 14, 23), - CreateJoinOneToBranch(context, 15, 15), - CreateJoinOneToBranch(context, 15, 16), - CreateJoinOneToBranch(context, 15, 24), - CreateJoinOneToBranch(context, 16, 11), - CreateJoinOneToBranch(context, 17, 11), - CreateJoinOneToBranch(context, 17, 21), - CreateJoinOneToBranch(context, 18, 12), - CreateJoinOneToBranch(context, 18, 15), - CreateJoinOneToBranch(context, 18, 24), - CreateJoinOneToBranch(context, 19, 11), - CreateJoinOneToBranch(context, 19, 12), - CreateJoinOneToBranch(context, 19, 16), - CreateJoinOneToBranch(context, 19, 23), - CreateJoinOneToBranch(context, 20, 21), - CreateJoinOneToBranch(context, 20, 23) + CreateJoinOneToBranch(context, _ones[1], _roots[15]), + CreateJoinOneToBranch(context, _ones[1], _roots[19]), + CreateJoinOneToBranch(context, _ones[2], _roots[13]), + CreateJoinOneToBranch(context, _ones[2], _roots[15]), + CreateJoinOneToBranch(context, _ones[2], _roots[17]), + CreateJoinOneToBranch(context, _ones[2], _roots[19]), + CreateJoinOneToBranch(context, _ones[4], _roots[12]), + CreateJoinOneToBranch(context, _ones[5], _roots[15]), + CreateJoinOneToBranch(context, _ones[5], _roots[17]), + CreateJoinOneToBranch(context, _ones[5], _roots[18]), + CreateJoinOneToBranch(context, _ones[7], _roots[10]), + CreateJoinOneToBranch(context, _ones[7], _roots[11]), + CreateJoinOneToBranch(context, _ones[7], _roots[12]), + CreateJoinOneToBranch(context, _ones[8], _roots[10]), + CreateJoinOneToBranch(context, _ones[8], _roots[11]), + CreateJoinOneToBranch(context, _ones[8], _roots[13]), + CreateJoinOneToBranch(context, _ones[8], _roots[15]), + CreateJoinOneToBranch(context, _ones[8], _roots[16]), + CreateJoinOneToBranch(context, _ones[8], _roots[19]), + CreateJoinOneToBranch(context, _ones[9], _roots[11]), + CreateJoinOneToBranch(context, _ones[9], _roots[12]), + CreateJoinOneToBranch(context, _ones[9], _roots[13]), + CreateJoinOneToBranch(context, _ones[9], _roots[16]), + CreateJoinOneToBranch(context, _ones[11], _roots[10]), + CreateJoinOneToBranch(context, _ones[11], _roots[11]), + CreateJoinOneToBranch(context, _ones[11], _roots[13]), + CreateJoinOneToBranch(context, _ones[11], _roots[18]), + CreateJoinOneToBranch(context, _ones[12], _roots[14]), + CreateJoinOneToBranch(context, _ones[13], _roots[11]), + CreateJoinOneToBranch(context, _ones[13], _roots[13]), + CreateJoinOneToBranch(context, _ones[13], _roots[15]), + CreateJoinOneToBranch(context, _ones[13], _roots[18]), + CreateJoinOneToBranch(context, _ones[14], _roots[14]), + CreateJoinOneToBranch(context, _ones[14], _roots[15]), + CreateJoinOneToBranch(context, _ones[14], _roots[19]), + CreateJoinOneToBranch(context, _ones[15], _roots[10]), + CreateJoinOneToBranch(context, _ones[16], _roots[10]), + CreateJoinOneToBranch(context, _ones[16], _roots[16]), + CreateJoinOneToBranch(context, _ones[17], _roots[11]), + CreateJoinOneToBranch(context, _ones[17], _roots[14]), + CreateJoinOneToBranch(context, _ones[17], _roots[19]), + CreateJoinOneToBranch(context, _ones[18], _roots[10]), + CreateJoinOneToBranch(context, _ones[18], _roots[11]), + CreateJoinOneToBranch(context, _ones[18], _roots[15]), + CreateJoinOneToBranch(context, _ones[18], _roots[18]), + CreateJoinOneToBranch(context, _ones[19], _roots[16]), + CreateJoinOneToBranch(context, _ones[19], _roots[18]) }; private static JoinOneToBranch CreateJoinOneToBranch( ManyToManyContext context, - int oneId, - int branchId) + EntityOne one, + EntityRoot branch) => CreateInstance( context?.Set(), (e, p) => { - e.EntityOneId = oneId; - e.EntityBranchId = branchId; + e.EntityOneId = context?.Entry(one).Property(e => e.Id).CurrentValue ?? one.Id; + e.EntityBranchId = context?.Entry(branch).Property(e => e.Id).CurrentValue ?? branch.Id; }); - private static JoinOneToThreePayloadFull[] CreateJoinOneToThreePayloadFulls(ManyToManyContext context) + private JoinOneToThreePayloadFull[] CreateJoinOneToThreePayloadFulls(ManyToManyContext context) => new[] { - CreateJoinOneToThreePayloadFull(context, 1, 2, "Ira Watts"), - CreateJoinOneToThreePayloadFull(context, 1, 6, "Harold May"), - CreateJoinOneToThreePayloadFull(context, 1, 9, "Freda Vaughn"), - CreateJoinOneToThreePayloadFull(context, 1, 13, "Pedro Mccarthy"), - CreateJoinOneToThreePayloadFull(context, 1, 17, "Elaine Simon"), - CreateJoinOneToThreePayloadFull(context, 2, 9, "Melvin Maldonado"), - CreateJoinOneToThreePayloadFull(context, 2, 11, "Lora George"), - CreateJoinOneToThreePayloadFull(context, 2, 13, "Joey Cohen"), - CreateJoinOneToThreePayloadFull(context, 2, 14, "Erik Carroll"), - CreateJoinOneToThreePayloadFull(context, 2, 16, "April Rodriguez"), - CreateJoinOneToThreePayloadFull(context, 3, 5, "Gerardo Colon"), - CreateJoinOneToThreePayloadFull(context, 3, 12, "Alexander Willis"), - CreateJoinOneToThreePayloadFull(context, 3, 16, "Laura Wheeler"), - CreateJoinOneToThreePayloadFull(context, 3, 19, "Lester Summers"), - CreateJoinOneToThreePayloadFull(context, 4, 2, "Raquel Curry"), - CreateJoinOneToThreePayloadFull(context, 4, 4, "Steven Fisher"), - CreateJoinOneToThreePayloadFull(context, 4, 11, "Casey Williams"), - CreateJoinOneToThreePayloadFull(context, 4, 13, "Lauren Clayton"), - CreateJoinOneToThreePayloadFull(context, 4, 19, "Maureen Weber"), - CreateJoinOneToThreePayloadFull(context, 5, 4, "Joyce Ford"), - CreateJoinOneToThreePayloadFull(context, 5, 6, "Willie Mccormick"), - CreateJoinOneToThreePayloadFull(context, 5, 9, "Geraldine Jackson"), - CreateJoinOneToThreePayloadFull(context, 7, 1, "Victor Aguilar"), - CreateJoinOneToThreePayloadFull(context, 7, 4, "Cathy Allen"), - CreateJoinOneToThreePayloadFull(context, 7, 9, "Edwin Burke"), - CreateJoinOneToThreePayloadFull(context, 7, 10, "Eugene Flores"), - CreateJoinOneToThreePayloadFull(context, 7, 11, "Ginger Patton"), - CreateJoinOneToThreePayloadFull(context, 7, 12, "Israel Mitchell"), - CreateJoinOneToThreePayloadFull(context, 7, 18, "Joy Francis"), - CreateJoinOneToThreePayloadFull(context, 8, 1, "Orville Parker"), - CreateJoinOneToThreePayloadFull(context, 8, 3, "Alyssa Mann"), - CreateJoinOneToThreePayloadFull(context, 8, 4, "Hugh Daniel"), - CreateJoinOneToThreePayloadFull(context, 8, 13, "Kim Craig"), - CreateJoinOneToThreePayloadFull(context, 8, 14, "Lucille Moreno"), - CreateJoinOneToThreePayloadFull(context, 8, 17, "Virgil Drake"), - CreateJoinOneToThreePayloadFull(context, 8, 18, "Josephine Dawson"), - CreateJoinOneToThreePayloadFull(context, 8, 20, "Milton Huff"), - CreateJoinOneToThreePayloadFull(context, 9, 2, "Jody Clarke"), - CreateJoinOneToThreePayloadFull(context, 9, 9, "Elisa Cooper"), - CreateJoinOneToThreePayloadFull(context, 9, 11, "Grace Owen"), - CreateJoinOneToThreePayloadFull(context, 9, 12, "Donald Welch"), - CreateJoinOneToThreePayloadFull(context, 9, 15, "Marian Day"), - CreateJoinOneToThreePayloadFull(context, 9, 17, "Cory Cortez"), - CreateJoinOneToThreePayloadFull(context, 10, 2, "Chad Rowe"), - CreateJoinOneToThreePayloadFull(context, 10, 3, "Simon Reyes"), - CreateJoinOneToThreePayloadFull(context, 10, 4, "Shari Jensen"), - CreateJoinOneToThreePayloadFull(context, 10, 8, "Ricky Bradley"), - CreateJoinOneToThreePayloadFull(context, 10, 10, "Debra Gibbs"), - CreateJoinOneToThreePayloadFull(context, 10, 11, "Everett Mckenzie"), - CreateJoinOneToThreePayloadFull(context, 10, 14, "Kirk Graham"), - CreateJoinOneToThreePayloadFull(context, 10, 16, "Paulette Adkins"), - CreateJoinOneToThreePayloadFull(context, 10, 18, "Raul Holloway"), - CreateJoinOneToThreePayloadFull(context, 10, 19, "Danielle Ross"), - CreateJoinOneToThreePayloadFull(context, 11, 1, "Frank Garner"), - CreateJoinOneToThreePayloadFull(context, 11, 6, "Stella Thompson"), - CreateJoinOneToThreePayloadFull(context, 11, 8, "Peggy Wagner"), - CreateJoinOneToThreePayloadFull(context, 11, 9, "Geneva Holmes"), - CreateJoinOneToThreePayloadFull(context, 11, 10, "Ignacio Black"), - CreateJoinOneToThreePayloadFull(context, 11, 13, "Phillip Wells"), - CreateJoinOneToThreePayloadFull(context, 11, 14, "Hubert Lambert"), - CreateJoinOneToThreePayloadFull(context, 11, 19, "Courtney Gregory"), - CreateJoinOneToThreePayloadFull(context, 12, 2, "Esther Carter"), - CreateJoinOneToThreePayloadFull(context, 13, 6, "Thomas Benson"), - CreateJoinOneToThreePayloadFull(context, 13, 9, "Kara Baldwin"), - CreateJoinOneToThreePayloadFull(context, 13, 10, "Yvonne Sparks"), - CreateJoinOneToThreePayloadFull(context, 13, 11, "Darin Mathis"), - CreateJoinOneToThreePayloadFull(context, 13, 12, "Glenda Castillo"), - CreateJoinOneToThreePayloadFull(context, 13, 13, "Larry Walters"), - CreateJoinOneToThreePayloadFull(context, 13, 15, "Meredith Yates"), - CreateJoinOneToThreePayloadFull(context, 13, 16, "Rosemarie Henry"), - CreateJoinOneToThreePayloadFull(context, 13, 18, "Nora Leonard"), - CreateJoinOneToThreePayloadFull(context, 14, 17, "Corey Delgado"), - CreateJoinOneToThreePayloadFull(context, 14, 18, "Kari Strickland"), - CreateJoinOneToThreePayloadFull(context, 15, 8, "Joann Stanley"), - CreateJoinOneToThreePayloadFull(context, 15, 11, "Camille Gordon"), - CreateJoinOneToThreePayloadFull(context, 15, 14, "Flora Anderson"), - CreateJoinOneToThreePayloadFull(context, 15, 15, "Wilbur Soto"), - CreateJoinOneToThreePayloadFull(context, 15, 18, "Shirley Andrews"), - CreateJoinOneToThreePayloadFull(context, 15, 20, "Marcus Mcguire"), - CreateJoinOneToThreePayloadFull(context, 16, 1, "Saul Dixon"), - CreateJoinOneToThreePayloadFull(context, 16, 6, "Cynthia Hart"), - CreateJoinOneToThreePayloadFull(context, 16, 10, "Elbert Spencer"), - CreateJoinOneToThreePayloadFull(context, 16, 13, "Darrell Norris"), - CreateJoinOneToThreePayloadFull(context, 16, 14, "Jamie Kelley"), - CreateJoinOneToThreePayloadFull(context, 16, 15, "Francis Briggs"), - CreateJoinOneToThreePayloadFull(context, 16, 16, "Lindsey Morris"), - CreateJoinOneToThreePayloadFull(context, 17, 2, "James Castro"), - CreateJoinOneToThreePayloadFull(context, 17, 5, "Carlos Chavez"), - CreateJoinOneToThreePayloadFull(context, 17, 7, "Janis Valdez"), - CreateJoinOneToThreePayloadFull(context, 17, 13, "Alfredo Bowen"), - CreateJoinOneToThreePayloadFull(context, 17, 14, "Viola Torres"), - CreateJoinOneToThreePayloadFull(context, 17, 15, "Dianna Lowe"), - CreateJoinOneToThreePayloadFull(context, 18, 3, "Craig Howell"), - CreateJoinOneToThreePayloadFull(context, 18, 7, "Sandy Curtis"), - CreateJoinOneToThreePayloadFull(context, 18, 12, "Alonzo Pierce"), - CreateJoinOneToThreePayloadFull(context, 18, 18, "Albert Harper"), - CreateJoinOneToThreePayloadFull(context, 19, 2, "Frankie Baker"), - CreateJoinOneToThreePayloadFull(context, 19, 5, "Candace Tucker"), - CreateJoinOneToThreePayloadFull(context, 19, 6, "Willis Christensen"), - CreateJoinOneToThreePayloadFull(context, 19, 7, "Juan Joseph"), - CreateJoinOneToThreePayloadFull(context, 19, 10, "Thelma Sanders"), - CreateJoinOneToThreePayloadFull(context, 19, 11, "Kerry West"), - CreateJoinOneToThreePayloadFull(context, 19, 15, "Sheri Castro"), - CreateJoinOneToThreePayloadFull(context, 19, 16, "Mark Schultz"), - CreateJoinOneToThreePayloadFull(context, 19, 17, "Priscilla Summers"), - CreateJoinOneToThreePayloadFull(context, 19, 20, "Allan Valdez"), - CreateJoinOneToThreePayloadFull(context, 20, 3, "Bill Peters"), - CreateJoinOneToThreePayloadFull(context, 20, 5, "Cora Stone"), - CreateJoinOneToThreePayloadFull(context, 20, 6, "Frankie Pope"), - CreateJoinOneToThreePayloadFull(context, 20, 10, "Christian Young"), - CreateJoinOneToThreePayloadFull(context, 20, 11, "Shari Brewer"), - CreateJoinOneToThreePayloadFull(context, 20, 12, "Antonia Wolfe"), - CreateJoinOneToThreePayloadFull(context, 20, 14, "Lawrence Matthews"), - CreateJoinOneToThreePayloadFull(context, 20, 18, "Van Hubbard"), - CreateJoinOneToThreePayloadFull(context, 20, 20, "Lindsay Pena") + CreateJoinOneToThreePayloadFull(context, _ones[0], _threes[1], "Ira Watts"), + CreateJoinOneToThreePayloadFull(context, _ones[0], _threes[5], "Harold May"), + CreateJoinOneToThreePayloadFull(context, _ones[0], _threes[8], "Freda Vaughn"), + CreateJoinOneToThreePayloadFull(context, _ones[0], _threes[12], "Pedro Mccarthy"), + CreateJoinOneToThreePayloadFull(context, _ones[0], _threes[16], "Elaine Simon"), + CreateJoinOneToThreePayloadFull(context, _ones[1], _threes[8], "Melvin Maldonado"), + CreateJoinOneToThreePayloadFull(context, _ones[1], _threes[10], "Lora George"), + CreateJoinOneToThreePayloadFull(context, _ones[1], _threes[12], "Joey Cohen"), + CreateJoinOneToThreePayloadFull(context, _ones[1], _threes[13], "Erik Carroll"), + CreateJoinOneToThreePayloadFull(context, _ones[1], _threes[15], "April Rodriguez"), + CreateJoinOneToThreePayloadFull(context, _ones[2], _threes[4], "Gerardo Colon"), + CreateJoinOneToThreePayloadFull(context, _ones[2], _threes[11], "Alexander Willis"), + CreateJoinOneToThreePayloadFull(context, _ones[2], _threes[15], "Laura Wheeler"), + CreateJoinOneToThreePayloadFull(context, _ones[2], _threes[18], "Lester Summers"), + CreateJoinOneToThreePayloadFull(context, _ones[3], _threes[1], "Raquel Curry"), + CreateJoinOneToThreePayloadFull(context, _ones[3], _threes[3], "Steven Fisher"), + CreateJoinOneToThreePayloadFull(context, _ones[3], _threes[10], "Casey Williams"), + CreateJoinOneToThreePayloadFull(context, _ones[3], _threes[12], "Lauren Clayton"), + CreateJoinOneToThreePayloadFull(context, _ones[3], _threes[18], "Maureen Weber"), + CreateJoinOneToThreePayloadFull(context, _ones[4], _threes[3], "Joyce Ford"), + CreateJoinOneToThreePayloadFull(context, _ones[4], _threes[5], "Willie Mccormick"), + CreateJoinOneToThreePayloadFull(context, _ones[4], _threes[8], "Geraldine Jackson"), + CreateJoinOneToThreePayloadFull(context, _ones[6], _threes[0], "Victor Aguilar"), + CreateJoinOneToThreePayloadFull(context, _ones[6], _threes[3], "Cathy Allen"), + CreateJoinOneToThreePayloadFull(context, _ones[6], _threes[8], "Edwin Burke"), + CreateJoinOneToThreePayloadFull(context, _ones[6], _threes[9], "Eugene Flores"), + CreateJoinOneToThreePayloadFull(context, _ones[6], _threes[10], "Ginger Patton"), + CreateJoinOneToThreePayloadFull(context, _ones[6], _threes[11], "Israel Mitchell"), + CreateJoinOneToThreePayloadFull(context, _ones[6], _threes[17], "Joy Francis"), + CreateJoinOneToThreePayloadFull(context, _ones[7], _threes[0], "Orville Parker"), + CreateJoinOneToThreePayloadFull(context, _ones[7], _threes[2], "Alyssa Mann"), + CreateJoinOneToThreePayloadFull(context, _ones[7], _threes[3], "Hugh Daniel"), + CreateJoinOneToThreePayloadFull(context, _ones[7], _threes[12], "Kim Craig"), + CreateJoinOneToThreePayloadFull(context, _ones[7], _threes[13], "Lucille Moreno"), + CreateJoinOneToThreePayloadFull(context, _ones[7], _threes[16], "Virgil Drake"), + CreateJoinOneToThreePayloadFull(context, _ones[7], _threes[17], "Josephine Dawson"), + CreateJoinOneToThreePayloadFull(context, _ones[7], _threes[19], "Milton Huff"), + CreateJoinOneToThreePayloadFull(context, _ones[8], _threes[1], "Jody Clarke"), + CreateJoinOneToThreePayloadFull(context, _ones[8], _threes[8], "Elisa Cooper"), + CreateJoinOneToThreePayloadFull(context, _ones[8], _threes[10], "Grace Owen"), + CreateJoinOneToThreePayloadFull(context, _ones[8], _threes[11], "Donald Welch"), + CreateJoinOneToThreePayloadFull(context, _ones[8], _threes[14], "Marian Day"), + CreateJoinOneToThreePayloadFull(context, _ones[8], _threes[16], "Cory Cortez"), + CreateJoinOneToThreePayloadFull(context, _ones[9], _threes[1], "Chad Rowe"), + CreateJoinOneToThreePayloadFull(context, _ones[9], _threes[2], "Simon Reyes"), + CreateJoinOneToThreePayloadFull(context, _ones[9], _threes[3], "Shari Jensen"), + CreateJoinOneToThreePayloadFull(context, _ones[9], _threes[7], "Ricky Bradley"), + CreateJoinOneToThreePayloadFull(context, _ones[9], _threes[9], "Debra Gibbs"), + CreateJoinOneToThreePayloadFull(context, _ones[9], _threes[10], "Everett Mckenzie"), + CreateJoinOneToThreePayloadFull(context, _ones[9], _threes[13], "Kirk Graham"), + CreateJoinOneToThreePayloadFull(context, _ones[9], _threes[15], "Paulette Adkins"), + CreateJoinOneToThreePayloadFull(context, _ones[9], _threes[17], "Raul Holloway"), + CreateJoinOneToThreePayloadFull(context, _ones[9], _threes[18], "Danielle Ross"), + CreateJoinOneToThreePayloadFull(context, _ones[10], _threes[0], "Frank Garner"), + CreateJoinOneToThreePayloadFull(context, _ones[10], _threes[5], "Stella Thompson"), + CreateJoinOneToThreePayloadFull(context, _ones[10], _threes[7], "Peggy Wagner"), + CreateJoinOneToThreePayloadFull(context, _ones[10], _threes[8], "Geneva Holmes"), + CreateJoinOneToThreePayloadFull(context, _ones[10], _threes[9], "Ignacio Black"), + CreateJoinOneToThreePayloadFull(context, _ones[10], _threes[12], "Phillip Wells"), + CreateJoinOneToThreePayloadFull(context, _ones[10], _threes[13], "Hubert Lambert"), + CreateJoinOneToThreePayloadFull(context, _ones[10], _threes[18], "Courtney Gregory"), + CreateJoinOneToThreePayloadFull(context, _ones[11], _threes[1], "Esther Carter"), + CreateJoinOneToThreePayloadFull(context, _ones[12], _threes[5], "Thomas Benson"), + CreateJoinOneToThreePayloadFull(context, _ones[12], _threes[8], "Kara Baldwin"), + CreateJoinOneToThreePayloadFull(context, _ones[12], _threes[9], "Yvonne Sparks"), + CreateJoinOneToThreePayloadFull(context, _ones[12], _threes[10], "Darin Mathis"), + CreateJoinOneToThreePayloadFull(context, _ones[12], _threes[11], "Glenda Castillo"), + CreateJoinOneToThreePayloadFull(context, _ones[12], _threes[12], "Larry Walters"), + CreateJoinOneToThreePayloadFull(context, _ones[12], _threes[14], "Meredith Yates"), + CreateJoinOneToThreePayloadFull(context, _ones[12], _threes[15], "Rosemarie Henry"), + CreateJoinOneToThreePayloadFull(context, _ones[12], _threes[17], "Nora Leonard"), + CreateJoinOneToThreePayloadFull(context, _ones[13], _threes[16], "Corey Delgado"), + CreateJoinOneToThreePayloadFull(context, _ones[13], _threes[17], "Kari Strickland"), + CreateJoinOneToThreePayloadFull(context, _ones[14], _threes[7], "Joann Stanley"), + CreateJoinOneToThreePayloadFull(context, _ones[14], _threes[10], "Camille Gordon"), + CreateJoinOneToThreePayloadFull(context, _ones[14], _threes[13], "Flora Anderson"), + CreateJoinOneToThreePayloadFull(context, _ones[14], _threes[14], "Wilbur Soto"), + CreateJoinOneToThreePayloadFull(context, _ones[14], _threes[17], "Shirley Andrews"), + CreateJoinOneToThreePayloadFull(context, _ones[14], _threes[19], "Marcus Mcguire"), + CreateJoinOneToThreePayloadFull(context, _ones[15], _threes[0], "Saul Dixon"), + CreateJoinOneToThreePayloadFull(context, _ones[15], _threes[5], "Cynthia Hart"), + CreateJoinOneToThreePayloadFull(context, _ones[15], _threes[9], "Elbert Spencer"), + CreateJoinOneToThreePayloadFull(context, _ones[15], _threes[12], "Darrell Norris"), + CreateJoinOneToThreePayloadFull(context, _ones[15], _threes[13], "Jamie Kelley"), + CreateJoinOneToThreePayloadFull(context, _ones[15], _threes[14], "Francis Briggs"), + CreateJoinOneToThreePayloadFull(context, _ones[15], _threes[15], "Lindsey Morris"), + CreateJoinOneToThreePayloadFull(context, _ones[16], _threes[1], "James Castro"), + CreateJoinOneToThreePayloadFull(context, _ones[16], _threes[4], "Carlos Chavez"), + CreateJoinOneToThreePayloadFull(context, _ones[16], _threes[6], "Janis Valdez"), + CreateJoinOneToThreePayloadFull(context, _ones[16], _threes[12], "Alfredo Bowen"), + CreateJoinOneToThreePayloadFull(context, _ones[16], _threes[13], "Viola Torres"), + CreateJoinOneToThreePayloadFull(context, _ones[16], _threes[14], "Dianna Lowe"), + CreateJoinOneToThreePayloadFull(context, _ones[17], _threes[2], "Craig Howell"), + CreateJoinOneToThreePayloadFull(context, _ones[17], _threes[6], "Sandy Curtis"), + CreateJoinOneToThreePayloadFull(context, _ones[17], _threes[11], "Alonzo Pierce"), + CreateJoinOneToThreePayloadFull(context, _ones[17], _threes[17], "Albert Harper"), + CreateJoinOneToThreePayloadFull(context, _ones[18], _threes[1], "Frankie Baker"), + CreateJoinOneToThreePayloadFull(context, _ones[18], _threes[4], "Candace Tucker"), + CreateJoinOneToThreePayloadFull(context, _ones[18], _threes[5], "Willis Christensen"), + CreateJoinOneToThreePayloadFull(context, _ones[18], _threes[6], "Juan Joseph"), + CreateJoinOneToThreePayloadFull(context, _ones[18], _threes[9], "Thelma Sanders"), + CreateJoinOneToThreePayloadFull(context, _ones[18], _threes[10], "Kerry West"), + CreateJoinOneToThreePayloadFull(context, _ones[18], _threes[14], "Sheri Castro"), + CreateJoinOneToThreePayloadFull(context, _ones[18], _threes[15], "Mark Schultz"), + CreateJoinOneToThreePayloadFull(context, _ones[18], _threes[16], "Priscilla Summers"), + CreateJoinOneToThreePayloadFull(context, _ones[18], _threes[19], "Allan Valdez"), + CreateJoinOneToThreePayloadFull(context, _ones[19], _threes[2], "Bill Peters"), + CreateJoinOneToThreePayloadFull(context, _ones[19], _threes[4], "Cora Stone"), + CreateJoinOneToThreePayloadFull(context, _ones[19], _threes[5], "Frankie Pope"), + CreateJoinOneToThreePayloadFull(context, _ones[19], _threes[9], "Christian Young"), + CreateJoinOneToThreePayloadFull(context, _ones[19], _threes[10], "Shari Brewer"), + CreateJoinOneToThreePayloadFull(context, _ones[19], _threes[11], "Antonia Wolfe"), + CreateJoinOneToThreePayloadFull(context, _ones[19], _threes[13], "Lawrence Matthews"), + CreateJoinOneToThreePayloadFull(context, _ones[19], _threes[17], "Van Hubbard"), + CreateJoinOneToThreePayloadFull(context, _ones[19], _threes[19], "Lindsay Pena") }; private static JoinOneToThreePayloadFull CreateJoinOneToThreePayloadFull( ManyToManyContext context, - int oneId, - int threeId, + EntityOne one, + EntityThree three, string payload) => CreateInstance( context?.Set(), (e, p) => { - e.OneId = oneId; - e.ThreeId = threeId; + e.One = one; + e.Three = three; e.Payload = payload; }); - private static JoinOneToTwo[] CreateJoinOneToTwos(ManyToManyContext context) + private JoinOneToTwo[] CreateJoinOneToTwos(ManyToManyContext context) => new[] { - CreateJoinOneToTwo(context, 1, 1), - CreateJoinOneToTwo(context, 1, 2), - CreateJoinOneToTwo(context, 1, 3), - CreateJoinOneToTwo(context, 1, 4), - CreateJoinOneToTwo(context, 1, 5), - CreateJoinOneToTwo(context, 1, 6), - CreateJoinOneToTwo(context, 1, 7), - CreateJoinOneToTwo(context, 1, 8), - CreateJoinOneToTwo(context, 1, 9), - CreateJoinOneToTwo(context, 1, 10), - CreateJoinOneToTwo(context, 1, 11), - CreateJoinOneToTwo(context, 1, 12), - CreateJoinOneToTwo(context, 1, 13), - CreateJoinOneToTwo(context, 1, 14), - CreateJoinOneToTwo(context, 1, 15), - CreateJoinOneToTwo(context, 1, 16), - CreateJoinOneToTwo(context, 1, 17), - CreateJoinOneToTwo(context, 1, 18), - CreateJoinOneToTwo(context, 1, 19), - CreateJoinOneToTwo(context, 1, 20), - CreateJoinOneToTwo(context, 2, 1), - CreateJoinOneToTwo(context, 2, 3), - CreateJoinOneToTwo(context, 2, 5), - CreateJoinOneToTwo(context, 2, 7), - CreateJoinOneToTwo(context, 2, 9), - CreateJoinOneToTwo(context, 2, 11), - CreateJoinOneToTwo(context, 2, 13), - CreateJoinOneToTwo(context, 2, 15), - CreateJoinOneToTwo(context, 2, 17), - CreateJoinOneToTwo(context, 2, 19), - CreateJoinOneToTwo(context, 3, 1), - CreateJoinOneToTwo(context, 3, 4), - CreateJoinOneToTwo(context, 3, 7), - CreateJoinOneToTwo(context, 3, 10), - CreateJoinOneToTwo(context, 3, 13), - CreateJoinOneToTwo(context, 3, 16), - CreateJoinOneToTwo(context, 3, 19), - CreateJoinOneToTwo(context, 4, 1), - CreateJoinOneToTwo(context, 4, 5), - CreateJoinOneToTwo(context, 4, 9), - CreateJoinOneToTwo(context, 4, 13), - CreateJoinOneToTwo(context, 4, 17), - CreateJoinOneToTwo(context, 5, 1), - CreateJoinOneToTwo(context, 5, 6), - CreateJoinOneToTwo(context, 5, 11), - CreateJoinOneToTwo(context, 5, 16), - CreateJoinOneToTwo(context, 6, 1), - CreateJoinOneToTwo(context, 6, 7), - CreateJoinOneToTwo(context, 6, 13), - CreateJoinOneToTwo(context, 6, 19), - CreateJoinOneToTwo(context, 7, 1), - CreateJoinOneToTwo(context, 7, 8), - CreateJoinOneToTwo(context, 7, 15), - CreateJoinOneToTwo(context, 8, 1), - CreateJoinOneToTwo(context, 8, 9), - CreateJoinOneToTwo(context, 8, 17), - CreateJoinOneToTwo(context, 9, 1), - CreateJoinOneToTwo(context, 9, 10), - CreateJoinOneToTwo(context, 9, 19), - CreateJoinOneToTwo(context, 10, 1), - CreateJoinOneToTwo(context, 10, 11), - CreateJoinOneToTwo(context, 11, 20), - CreateJoinOneToTwo(context, 11, 19), - CreateJoinOneToTwo(context, 11, 18), - CreateJoinOneToTwo(context, 11, 17), - CreateJoinOneToTwo(context, 11, 16), - CreateJoinOneToTwo(context, 11, 15), - CreateJoinOneToTwo(context, 11, 14), - CreateJoinOneToTwo(context, 11, 13), - CreateJoinOneToTwo(context, 11, 12), - CreateJoinOneToTwo(context, 11, 11), - CreateJoinOneToTwo(context, 11, 10), - CreateJoinOneToTwo(context, 11, 9), - CreateJoinOneToTwo(context, 11, 8), - CreateJoinOneToTwo(context, 11, 7), - CreateJoinOneToTwo(context, 11, 6), - CreateJoinOneToTwo(context, 11, 5), - CreateJoinOneToTwo(context, 11, 4), - CreateJoinOneToTwo(context, 11, 3), - CreateJoinOneToTwo(context, 11, 2), - CreateJoinOneToTwo(context, 11, 1), - CreateJoinOneToTwo(context, 12, 20), - CreateJoinOneToTwo(context, 12, 17), - CreateJoinOneToTwo(context, 12, 14), - CreateJoinOneToTwo(context, 12, 11), - CreateJoinOneToTwo(context, 12, 8), - CreateJoinOneToTwo(context, 12, 5), - CreateJoinOneToTwo(context, 12, 2), - CreateJoinOneToTwo(context, 13, 20), - CreateJoinOneToTwo(context, 13, 16), - CreateJoinOneToTwo(context, 13, 12), - CreateJoinOneToTwo(context, 13, 8), - CreateJoinOneToTwo(context, 13, 4), - CreateJoinOneToTwo(context, 14, 20), - CreateJoinOneToTwo(context, 14, 15), - CreateJoinOneToTwo(context, 14, 10), - CreateJoinOneToTwo(context, 14, 5), - CreateJoinOneToTwo(context, 15, 20), - CreateJoinOneToTwo(context, 15, 14), - CreateJoinOneToTwo(context, 15, 8), - CreateJoinOneToTwo(context, 15, 2), - CreateJoinOneToTwo(context, 16, 20), - CreateJoinOneToTwo(context, 16, 13), - CreateJoinOneToTwo(context, 16, 6), - CreateJoinOneToTwo(context, 17, 20), - CreateJoinOneToTwo(context, 17, 12), - CreateJoinOneToTwo(context, 17, 4), - CreateJoinOneToTwo(context, 18, 20), - CreateJoinOneToTwo(context, 18, 11), - CreateJoinOneToTwo(context, 18, 2), - CreateJoinOneToTwo(context, 19, 20), - CreateJoinOneToTwo(context, 19, 10) + CreateJoinOneToTwo(context, _ones[0], _twos[0]), + CreateJoinOneToTwo(context, _ones[0], _twos[1]), + CreateJoinOneToTwo(context, _ones[0], _twos[2]), + CreateJoinOneToTwo(context, _ones[0], _twos[3]), + CreateJoinOneToTwo(context, _ones[0], _twos[4]), + CreateJoinOneToTwo(context, _ones[0], _twos[5]), + CreateJoinOneToTwo(context, _ones[0], _twos[6]), + CreateJoinOneToTwo(context, _ones[0], _twos[7]), + CreateJoinOneToTwo(context, _ones[0], _twos[8]), + CreateJoinOneToTwo(context, _ones[0], _twos[9]), + CreateJoinOneToTwo(context, _ones[0], _twos[10]), + CreateJoinOneToTwo(context, _ones[0], _twos[11]), + CreateJoinOneToTwo(context, _ones[0], _twos[12]), + CreateJoinOneToTwo(context, _ones[0], _twos[13]), + CreateJoinOneToTwo(context, _ones[0], _twos[14]), + CreateJoinOneToTwo(context, _ones[0], _twos[15]), + CreateJoinOneToTwo(context, _ones[0], _twos[16]), + CreateJoinOneToTwo(context, _ones[0], _twos[17]), + CreateJoinOneToTwo(context, _ones[0], _twos[18]), + CreateJoinOneToTwo(context, _ones[0], _twos[19]), + CreateJoinOneToTwo(context, _ones[1], _twos[0]), + CreateJoinOneToTwo(context, _ones[1], _twos[2]), + CreateJoinOneToTwo(context, _ones[1], _twos[4]), + CreateJoinOneToTwo(context, _ones[1], _twos[6]), + CreateJoinOneToTwo(context, _ones[1], _twos[8]), + CreateJoinOneToTwo(context, _ones[1], _twos[10]), + CreateJoinOneToTwo(context, _ones[1], _twos[12]), + CreateJoinOneToTwo(context, _ones[1], _twos[14]), + CreateJoinOneToTwo(context, _ones[1], _twos[16]), + CreateJoinOneToTwo(context, _ones[1], _twos[18]), + CreateJoinOneToTwo(context, _ones[2], _twos[0]), + CreateJoinOneToTwo(context, _ones[2], _twos[3]), + CreateJoinOneToTwo(context, _ones[2], _twos[6]), + CreateJoinOneToTwo(context, _ones[2], _twos[9]), + CreateJoinOneToTwo(context, _ones[2], _twos[12]), + CreateJoinOneToTwo(context, _ones[2], _twos[15]), + CreateJoinOneToTwo(context, _ones[2], _twos[18]), + CreateJoinOneToTwo(context, _ones[3], _twos[0]), + CreateJoinOneToTwo(context, _ones[3], _twos[4]), + CreateJoinOneToTwo(context, _ones[3], _twos[8]), + CreateJoinOneToTwo(context, _ones[3], _twos[12]), + CreateJoinOneToTwo(context, _ones[3], _twos[16]), + CreateJoinOneToTwo(context, _ones[4], _twos[0]), + CreateJoinOneToTwo(context, _ones[4], _twos[5]), + CreateJoinOneToTwo(context, _ones[4], _twos[10]), + CreateJoinOneToTwo(context, _ones[4], _twos[15]), + CreateJoinOneToTwo(context, _ones[5], _twos[0]), + CreateJoinOneToTwo(context, _ones[5], _twos[6]), + CreateJoinOneToTwo(context, _ones[5], _twos[12]), + CreateJoinOneToTwo(context, _ones[5], _twos[18]), + CreateJoinOneToTwo(context, _ones[6], _twos[0]), + CreateJoinOneToTwo(context, _ones[6], _twos[7]), + CreateJoinOneToTwo(context, _ones[6], _twos[14]), + CreateJoinOneToTwo(context, _ones[7], _twos[0]), + CreateJoinOneToTwo(context, _ones[7], _twos[8]), + CreateJoinOneToTwo(context, _ones[7], _twos[16]), + CreateJoinOneToTwo(context, _ones[8], _twos[0]), + CreateJoinOneToTwo(context, _ones[8], _twos[9]), + CreateJoinOneToTwo(context, _ones[8], _twos[18]), + CreateJoinOneToTwo(context, _ones[9], _twos[0]), + CreateJoinOneToTwo(context, _ones[9], _twos[10]), + CreateJoinOneToTwo(context, _ones[10], _twos[19]), + CreateJoinOneToTwo(context, _ones[10], _twos[18]), + CreateJoinOneToTwo(context, _ones[10], _twos[17]), + CreateJoinOneToTwo(context, _ones[10], _twos[16]), + CreateJoinOneToTwo(context, _ones[10], _twos[15]), + CreateJoinOneToTwo(context, _ones[10], _twos[14]), + CreateJoinOneToTwo(context, _ones[10], _twos[13]), + CreateJoinOneToTwo(context, _ones[10], _twos[12]), + CreateJoinOneToTwo(context, _ones[10], _twos[11]), + CreateJoinOneToTwo(context, _ones[10], _twos[10]), + CreateJoinOneToTwo(context, _ones[10], _twos[9]), + CreateJoinOneToTwo(context, _ones[10], _twos[8]), + CreateJoinOneToTwo(context, _ones[10], _twos[7]), + CreateJoinOneToTwo(context, _ones[10], _twos[6]), + CreateJoinOneToTwo(context, _ones[10], _twos[5]), + CreateJoinOneToTwo(context, _ones[10], _twos[4]), + CreateJoinOneToTwo(context, _ones[10], _twos[3]), + CreateJoinOneToTwo(context, _ones[10], _twos[2]), + CreateJoinOneToTwo(context, _ones[10], _twos[1]), + CreateJoinOneToTwo(context, _ones[10], _twos[0]), + CreateJoinOneToTwo(context, _ones[11], _twos[19]), + CreateJoinOneToTwo(context, _ones[11], _twos[16]), + CreateJoinOneToTwo(context, _ones[11], _twos[13]), + CreateJoinOneToTwo(context, _ones[11], _twos[10]), + CreateJoinOneToTwo(context, _ones[11], _twos[7]), + CreateJoinOneToTwo(context, _ones[11], _twos[4]), + CreateJoinOneToTwo(context, _ones[11], _twos[1]), + CreateJoinOneToTwo(context, _ones[12], _twos[19]), + CreateJoinOneToTwo(context, _ones[12], _twos[15]), + CreateJoinOneToTwo(context, _ones[12], _twos[11]), + CreateJoinOneToTwo(context, _ones[12], _twos[7]), + CreateJoinOneToTwo(context, _ones[12], _twos[3]), + CreateJoinOneToTwo(context, _ones[13], _twos[19]), + CreateJoinOneToTwo(context, _ones[13], _twos[14]), + CreateJoinOneToTwo(context, _ones[13], _twos[9]), + CreateJoinOneToTwo(context, _ones[13], _twos[4]), + CreateJoinOneToTwo(context, _ones[14], _twos[19]), + CreateJoinOneToTwo(context, _ones[14], _twos[13]), + CreateJoinOneToTwo(context, _ones[14], _twos[7]), + CreateJoinOneToTwo(context, _ones[14], _twos[1]), + CreateJoinOneToTwo(context, _ones[15], _twos[19]), + CreateJoinOneToTwo(context, _ones[15], _twos[12]), + CreateJoinOneToTwo(context, _ones[15], _twos[5]), + CreateJoinOneToTwo(context, _ones[16], _twos[19]), + CreateJoinOneToTwo(context, _ones[16], _twos[11]), + CreateJoinOneToTwo(context, _ones[16], _twos[3]), + CreateJoinOneToTwo(context, _ones[17], _twos[19]), + CreateJoinOneToTwo(context, _ones[17], _twos[10]), + CreateJoinOneToTwo(context, _ones[17], _twos[1]), + CreateJoinOneToTwo(context, _ones[18], _twos[19]), + CreateJoinOneToTwo(context, _ones[18], _twos[9]) }; private static JoinOneToTwo CreateJoinOneToTwo( ManyToManyContext context, - int oneId, - int twoId) + EntityOne one, + EntityTwo two) => CreateInstance( context?.Set(), (e, p) => { - e.OneId = oneId; - e.TwoId = twoId; + e.OneId = context?.Entry(one).Property(e => e.Id).CurrentValue ?? one.Id; + e.TwoId = context?.Entry(two).Property(e => e.Id).CurrentValue ?? two.Id; }); - private static JoinThreeToCompositeKeyFull[] CreateJoinThreeToCompositeKeyFulls(ManyToManyContext context) + private JoinThreeToCompositeKeyFull[] CreateJoinThreeToCompositeKeyFulls(ManyToManyContext context) => new[] { - CreateJoinThreeToCompositeKeyFull(context, 1, 6, "6_1", new DateTime(2006, 1, 1)), - CreateJoinThreeToCompositeKeyFull(context, 2, 1, "1_1", new DateTime(2001, 1, 1)), - CreateJoinThreeToCompositeKeyFull(context, 2, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 2, 9, "9_7", new DateTime(2009, 7, 1)), - CreateJoinThreeToCompositeKeyFull(context, 3, 6, "6_1", new DateTime(2006, 1, 1)), - CreateJoinThreeToCompositeKeyFull(context, 3, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 3, 9, "9_7", new DateTime(2009, 7, 1)), - CreateJoinThreeToCompositeKeyFull(context, 5, 8, "8_4", new DateTime(2008, 4, 1)), - CreateJoinThreeToCompositeKeyFull(context, 5, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinThreeToCompositeKeyFull(context, 5, 9, "9_5", new DateTime(2009, 5, 1)), - CreateJoinThreeToCompositeKeyFull(context, 6, 6, "6_1", new DateTime(2006, 1, 1)), - CreateJoinThreeToCompositeKeyFull(context, 7, 3, "3_2", new DateTime(2003, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 7, 8, "8_1", new DateTime(2008, 1, 1)), - CreateJoinThreeToCompositeKeyFull(context, 8, 8, "8_3", new DateTime(2008, 3, 1)), - CreateJoinThreeToCompositeKeyFull(context, 8, 9, "9_6", new DateTime(2009, 6, 1)), - CreateJoinThreeToCompositeKeyFull(context, 9, 8, "8_1", new DateTime(2008, 1, 1)), - CreateJoinThreeToCompositeKeyFull(context, 9, 9, "9_3", new DateTime(2009, 3, 1)), - CreateJoinThreeToCompositeKeyFull(context, 10, 9, "9_3", new DateTime(2009, 3, 1)), - CreateJoinThreeToCompositeKeyFull(context, 11, 7, "7_1", new DateTime(2007, 1, 1)), - CreateJoinThreeToCompositeKeyFull(context, 11, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 12, 7, "7_2", new DateTime(2007, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 12, 8, "8_3", new DateTime(2008, 3, 1)), - CreateJoinThreeToCompositeKeyFull(context, 12, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinThreeToCompositeKeyFull(context, 13, 6, "6_1", new DateTime(2006, 1, 1)), - CreateJoinThreeToCompositeKeyFull(context, 13, 7, "7_2", new DateTime(2007, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 13, 9, "9_1", new DateTime(2009, 1, 1)), - CreateJoinThreeToCompositeKeyFull(context, 13, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 14, 8, "8_2", new DateTime(2008, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 14, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinThreeToCompositeKeyFull(context, 14, 9, "9_3", new DateTime(2009, 3, 1)), - CreateJoinThreeToCompositeKeyFull(context, 15, 8, "8_2", new DateTime(2008, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 15, 9, "9_1", new DateTime(2009, 1, 1)), - CreateJoinThreeToCompositeKeyFull(context, 15, 9, "9_6", new DateTime(2009, 6, 1)), - CreateJoinThreeToCompositeKeyFull(context, 16, 3, "3_3", new DateTime(2003, 3, 1)), - CreateJoinThreeToCompositeKeyFull(context, 16, 7, "7_1", new DateTime(2007, 1, 1)), - CreateJoinThreeToCompositeKeyFull(context, 16, 9, "9_6", new DateTime(2009, 6, 1)), - CreateJoinThreeToCompositeKeyFull(context, 17, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 17, 8, "8_2", new DateTime(2008, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 18, 3, "3_2", new DateTime(2003, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 19, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 19, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinThreeToCompositeKeyFull(context, 19, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 19, 9, "9_7", new DateTime(2009, 7, 1)), - CreateJoinThreeToCompositeKeyFull(context, 20, 3, "3_2", new DateTime(2003, 2, 1)), - CreateJoinThreeToCompositeKeyFull(context, 20, 7, "7_1", new DateTime(2007, 1, 1)) + CreateJoinThreeToCompositeKeyFull(context, _threes[0], _compositeKeys[5]), + CreateJoinThreeToCompositeKeyFull(context, _threes[1], _compositeKeys[0]), + CreateJoinThreeToCompositeKeyFull(context, _threes[1], _compositeKeys[14]), + CreateJoinThreeToCompositeKeyFull(context, _threes[1], _compositeKeys[19]), + CreateJoinThreeToCompositeKeyFull(context, _threes[2], _compositeKeys[5]), + CreateJoinThreeToCompositeKeyFull(context, _threes[2], _compositeKeys[14]), + CreateJoinThreeToCompositeKeyFull(context, _threes[2], _compositeKeys[19]), + CreateJoinThreeToCompositeKeyFull(context, _threes[4], _compositeKeys[11]), + CreateJoinThreeToCompositeKeyFull(context, _threes[4], _compositeKeys[12]), + CreateJoinThreeToCompositeKeyFull(context, _threes[4], _compositeKeys[17]), + CreateJoinThreeToCompositeKeyFull(context, _threes[5], _compositeKeys[5]), + CreateJoinThreeToCompositeKeyFull(context, _threes[6], _compositeKeys[3]), + CreateJoinThreeToCompositeKeyFull(context, _threes[6], _compositeKeys[8]), + CreateJoinThreeToCompositeKeyFull(context, _threes[7], _compositeKeys[10]), + CreateJoinThreeToCompositeKeyFull(context, _threes[7], _compositeKeys[18]), + CreateJoinThreeToCompositeKeyFull(context, _threes[8], _compositeKeys[8]), + CreateJoinThreeToCompositeKeyFull(context, _threes[8], _compositeKeys[15]), + CreateJoinThreeToCompositeKeyFull(context, _threes[9], _compositeKeys[15]), + CreateJoinThreeToCompositeKeyFull(context, _threes[10], _compositeKeys[6]), + CreateJoinThreeToCompositeKeyFull(context, _threes[10], _compositeKeys[14]), + CreateJoinThreeToCompositeKeyFull(context, _threes[11], _compositeKeys[7]), + CreateJoinThreeToCompositeKeyFull(context, _threes[11], _compositeKeys[10]), + CreateJoinThreeToCompositeKeyFull(context, _threes[11], _compositeKeys[12]), + CreateJoinThreeToCompositeKeyFull(context, _threes[12], _compositeKeys[5]), + CreateJoinThreeToCompositeKeyFull(context, _threes[12], _compositeKeys[7]), + CreateJoinThreeToCompositeKeyFull(context, _threes[12], _compositeKeys[13]), + CreateJoinThreeToCompositeKeyFull(context, _threes[12], _compositeKeys[14]), + CreateJoinThreeToCompositeKeyFull(context, _threes[13], _compositeKeys[9]), + CreateJoinThreeToCompositeKeyFull(context, _threes[13], _compositeKeys[12]), + CreateJoinThreeToCompositeKeyFull(context, _threes[13], _compositeKeys[15]), + CreateJoinThreeToCompositeKeyFull(context, _threes[14], _compositeKeys[9]), + CreateJoinThreeToCompositeKeyFull(context, _threes[14], _compositeKeys[13]), + CreateJoinThreeToCompositeKeyFull(context, _threes[14], _compositeKeys[18]), + CreateJoinThreeToCompositeKeyFull(context, _threes[15], _compositeKeys[4]), + CreateJoinThreeToCompositeKeyFull(context, _threes[15], _compositeKeys[6]), + CreateJoinThreeToCompositeKeyFull(context, _threes[15], _compositeKeys[18]), + CreateJoinThreeToCompositeKeyFull(context, _threes[16], _compositeKeys[1]), + CreateJoinThreeToCompositeKeyFull(context, _threes[16], _compositeKeys[9]), + CreateJoinThreeToCompositeKeyFull(context, _threes[17], _compositeKeys[3]), + CreateJoinThreeToCompositeKeyFull(context, _threes[18], _compositeKeys[1]), + CreateJoinThreeToCompositeKeyFull(context, _threes[18], _compositeKeys[12]), + CreateJoinThreeToCompositeKeyFull(context, _threes[18], _compositeKeys[14]), + CreateJoinThreeToCompositeKeyFull(context, _threes[18], _compositeKeys[19]), + CreateJoinThreeToCompositeKeyFull(context, _threes[19], _compositeKeys[3]), + CreateJoinThreeToCompositeKeyFull(context, _threes[19], _compositeKeys[6]) }; private static JoinThreeToCompositeKeyFull CreateJoinThreeToCompositeKeyFull( ManyToManyContext context, - int threeId, - int compositeId1, - string compositeId2, - DateTime compositeId3) + EntityThree three, + EntityCompositeKey composite) => CreateInstance( context?.Set(), (e, p) => { - e.ThreeId = threeId; - e.CompositeId1 = compositeId1; - e.CompositeId2 = compositeId2; - e.CompositeId3 = compositeId3; + e.Three = three; + e.Composite = composite; }); - private static JoinTwoToThree[] CreateJoinTwoToThrees(ManyToManyContext context) + private JoinTwoToThree[] CreateJoinTwoToThrees(ManyToManyContext context) => new[] { - CreateJoinTwoToThree(context, 1, 2), - CreateJoinTwoToThree(context, 1, 3), - CreateJoinTwoToThree(context, 1, 13), - CreateJoinTwoToThree(context, 1, 18), - CreateJoinTwoToThree(context, 2, 1), - CreateJoinTwoToThree(context, 2, 9), - CreateJoinTwoToThree(context, 2, 15), - CreateJoinTwoToThree(context, 3, 11), - CreateJoinTwoToThree(context, 3, 17), - CreateJoinTwoToThree(context, 4, 2), - CreateJoinTwoToThree(context, 4, 5), - CreateJoinTwoToThree(context, 4, 11), - CreateJoinTwoToThree(context, 5, 4), - CreateJoinTwoToThree(context, 5, 5), - CreateJoinTwoToThree(context, 6, 3), - CreateJoinTwoToThree(context, 6, 10), - CreateJoinTwoToThree(context, 6, 16), - CreateJoinTwoToThree(context, 6, 18), - CreateJoinTwoToThree(context, 7, 12), - CreateJoinTwoToThree(context, 7, 15), - CreateJoinTwoToThree(context, 7, 20), - CreateJoinTwoToThree(context, 8, 1), - CreateJoinTwoToThree(context, 8, 3), - CreateJoinTwoToThree(context, 8, 20), - CreateJoinTwoToThree(context, 9, 3), - CreateJoinTwoToThree(context, 9, 13), - CreateJoinTwoToThree(context, 9, 19), - CreateJoinTwoToThree(context, 10, 17), - CreateJoinTwoToThree(context, 11, 6), - CreateJoinTwoToThree(context, 11, 7), - CreateJoinTwoToThree(context, 11, 8), - CreateJoinTwoToThree(context, 11, 13), - CreateJoinTwoToThree(context, 12, 9), - CreateJoinTwoToThree(context, 13, 1), - CreateJoinTwoToThree(context, 13, 11), - CreateJoinTwoToThree(context, 13, 19), - CreateJoinTwoToThree(context, 14, 2), - CreateJoinTwoToThree(context, 15, 17), - CreateJoinTwoToThree(context, 16, 3), - CreateJoinTwoToThree(context, 16, 16), - CreateJoinTwoToThree(context, 18, 1), - CreateJoinTwoToThree(context, 18, 5), - CreateJoinTwoToThree(context, 18, 10), - CreateJoinTwoToThree(context, 19, 5), - CreateJoinTwoToThree(context, 19, 16), - CreateJoinTwoToThree(context, 19, 18), - CreateJoinTwoToThree(context, 20, 6), - CreateJoinTwoToThree(context, 20, 10), - CreateJoinTwoToThree(context, 20, 12), - CreateJoinTwoToThree(context, 20, 16), - CreateJoinTwoToThree(context, 20, 17), - CreateJoinTwoToThree(context, 20, 18) + CreateJoinTwoToThree(context, _twos[0], _threes[1]), + CreateJoinTwoToThree(context, _twos[0], _threes[2]), + CreateJoinTwoToThree(context, _twos[0], _threes[12]), + CreateJoinTwoToThree(context, _twos[0], _threes[17]), + CreateJoinTwoToThree(context, _twos[1], _threes[0]), + CreateJoinTwoToThree(context, _twos[1], _threes[8]), + CreateJoinTwoToThree(context, _twos[1], _threes[14]), + CreateJoinTwoToThree(context, _twos[2], _threes[10]), + CreateJoinTwoToThree(context, _twos[2], _threes[16]), + CreateJoinTwoToThree(context, _twos[3], _threes[1]), + CreateJoinTwoToThree(context, _twos[3], _threes[4]), + CreateJoinTwoToThree(context, _twos[3], _threes[10]), + CreateJoinTwoToThree(context, _twos[4], _threes[3]), + CreateJoinTwoToThree(context, _twos[4], _threes[4]), + CreateJoinTwoToThree(context, _twos[5], _threes[2]), + CreateJoinTwoToThree(context, _twos[5], _threes[9]), + CreateJoinTwoToThree(context, _twos[5], _threes[15]), + CreateJoinTwoToThree(context, _twos[5], _threes[17]), + CreateJoinTwoToThree(context, _twos[6], _threes[11]), + CreateJoinTwoToThree(context, _twos[6], _threes[14]), + CreateJoinTwoToThree(context, _twos[6], _threes[19]), + CreateJoinTwoToThree(context, _twos[7], _threes[0]), + CreateJoinTwoToThree(context, _twos[7], _threes[2]), + CreateJoinTwoToThree(context, _twos[7], _threes[19]), + CreateJoinTwoToThree(context, _twos[8], _threes[2]), + CreateJoinTwoToThree(context, _twos[8], _threes[12]), + CreateJoinTwoToThree(context, _twos[8], _threes[18]), + CreateJoinTwoToThree(context, _twos[9], _threes[16]), + CreateJoinTwoToThree(context, _twos[10], _threes[5]), + CreateJoinTwoToThree(context, _twos[10], _threes[6]), + CreateJoinTwoToThree(context, _twos[10], _threes[7]), + CreateJoinTwoToThree(context, _twos[10], _threes[12]), + CreateJoinTwoToThree(context, _twos[11], _threes[8]), + CreateJoinTwoToThree(context, _twos[12], _threes[0]), + CreateJoinTwoToThree(context, _twos[12], _threes[10]), + CreateJoinTwoToThree(context, _twos[12], _threes[18]), + CreateJoinTwoToThree(context, _twos[13], _threes[1]), + CreateJoinTwoToThree(context, _twos[14], _threes[16]), + CreateJoinTwoToThree(context, _twos[15], _threes[2]), + CreateJoinTwoToThree(context, _twos[15], _threes[15]), + CreateJoinTwoToThree(context, _twos[17], _threes[0]), + CreateJoinTwoToThree(context, _twos[17], _threes[4]), + CreateJoinTwoToThree(context, _twos[17], _threes[9]), + CreateJoinTwoToThree(context, _twos[18], _threes[4]), + CreateJoinTwoToThree(context, _twos[18], _threes[15]), + CreateJoinTwoToThree(context, _twos[18], _threes[17]), + CreateJoinTwoToThree(context, _twos[19], _threes[5]), + CreateJoinTwoToThree(context, _twos[19], _threes[9]), + CreateJoinTwoToThree(context, _twos[19], _threes[11]), + CreateJoinTwoToThree(context, _twos[19], _threes[15]), + CreateJoinTwoToThree(context, _twos[19], _threes[16]), + CreateJoinTwoToThree(context, _twos[19], _threes[17]) }; private static JoinTwoToThree CreateJoinTwoToThree( ManyToManyContext context, - int twoId, - int threeId) + EntityTwo two, + EntityThree three) => CreateInstance( context?.Set(), (e, p) => { - e.TwoId = twoId; - e.ThreeId = threeId; + e.Two = two; + e.Three = three; }); - private static Dictionary[] CreateEntityOneEntityTwos(ManyToManyContext context) + private Dictionary[] CreateEntityOneEntityTwos(ManyToManyContext context) => new[] { - CreateEntityOneEntityTwo(context, 1, 3), - CreateEntityOneEntityTwo(context, 1, 16), - CreateEntityOneEntityTwo(context, 2, 3), - CreateEntityOneEntityTwo(context, 2, 10), - CreateEntityOneEntityTwo(context, 2, 18), - CreateEntityOneEntityTwo(context, 3, 10), - CreateEntityOneEntityTwo(context, 3, 11), - CreateEntityOneEntityTwo(context, 3, 16), - CreateEntityOneEntityTwo(context, 5, 2), - CreateEntityOneEntityTwo(context, 5, 5), - CreateEntityOneEntityTwo(context, 5, 7), - CreateEntityOneEntityTwo(context, 5, 9), - CreateEntityOneEntityTwo(context, 5, 14), - CreateEntityOneEntityTwo(context, 6, 12), - CreateEntityOneEntityTwo(context, 7, 3), - CreateEntityOneEntityTwo(context, 7, 16), - CreateEntityOneEntityTwo(context, 7, 17), - CreateEntityOneEntityTwo(context, 8, 19), - CreateEntityOneEntityTwo(context, 9, 9), - CreateEntityOneEntityTwo(context, 9, 11), - CreateEntityOneEntityTwo(context, 10, 6), - CreateEntityOneEntityTwo(context, 10, 17), - CreateEntityOneEntityTwo(context, 10, 20), - CreateEntityOneEntityTwo(context, 11, 17), - CreateEntityOneEntityTwo(context, 11, 18), - CreateEntityOneEntityTwo(context, 12, 6), - CreateEntityOneEntityTwo(context, 12, 19), - CreateEntityOneEntityTwo(context, 13, 7), - CreateEntityOneEntityTwo(context, 13, 8), - CreateEntityOneEntityTwo(context, 13, 9), - CreateEntityOneEntityTwo(context, 13, 13), - CreateEntityOneEntityTwo(context, 14, 4), - CreateEntityOneEntityTwo(context, 14, 9), - CreateEntityOneEntityTwo(context, 14, 19), - CreateEntityOneEntityTwo(context, 15, 10), - CreateEntityOneEntityTwo(context, 16, 1), - CreateEntityOneEntityTwo(context, 16, 7), - CreateEntityOneEntityTwo(context, 16, 19), - CreateEntityOneEntityTwo(context, 17, 8), - CreateEntityOneEntityTwo(context, 17, 15), - CreateEntityOneEntityTwo(context, 18, 4), - CreateEntityOneEntityTwo(context, 18, 13), - CreateEntityOneEntityTwo(context, 18, 14), - CreateEntityOneEntityTwo(context, 19, 4), - CreateEntityOneEntityTwo(context, 19, 14) + CreateEntityOneEntityTwo(context, _ones[0], _twos[2]), + CreateEntityOneEntityTwo(context, _ones[0], _twos[15]), + CreateEntityOneEntityTwo(context, _ones[1], _twos[2]), + CreateEntityOneEntityTwo(context, _ones[1], _twos[9]), + CreateEntityOneEntityTwo(context, _ones[1], _twos[17]), + CreateEntityOneEntityTwo(context, _ones[2], _twos[9]), + CreateEntityOneEntityTwo(context, _ones[2], _twos[10]), + CreateEntityOneEntityTwo(context, _ones[2], _twos[15]), + CreateEntityOneEntityTwo(context, _ones[4], _twos[1]), + CreateEntityOneEntityTwo(context, _ones[4], _twos[4]), + CreateEntityOneEntityTwo(context, _ones[4], _twos[6]), + CreateEntityOneEntityTwo(context, _ones[4], _twos[8]), + CreateEntityOneEntityTwo(context, _ones[4], _twos[13]), + CreateEntityOneEntityTwo(context, _ones[5], _twos[11]), + CreateEntityOneEntityTwo(context, _ones[6], _twos[2]), + CreateEntityOneEntityTwo(context, _ones[6], _twos[15]), + CreateEntityOneEntityTwo(context, _ones[6], _twos[16]), + CreateEntityOneEntityTwo(context, _ones[7], _twos[18]), + CreateEntityOneEntityTwo(context, _ones[8], _twos[8]), + CreateEntityOneEntityTwo(context, _ones[8], _twos[10]), + CreateEntityOneEntityTwo(context, _ones[9], _twos[5]), + CreateEntityOneEntityTwo(context, _ones[9], _twos[16]), + CreateEntityOneEntityTwo(context, _ones[9], _twos[19]), + CreateEntityOneEntityTwo(context, _ones[10], _twos[16]), + CreateEntityOneEntityTwo(context, _ones[10], _twos[17]), + CreateEntityOneEntityTwo(context, _ones[11], _twos[5]), + CreateEntityOneEntityTwo(context, _ones[11], _twos[18]), + CreateEntityOneEntityTwo(context, _ones[12], _twos[6]), + CreateEntityOneEntityTwo(context, _ones[12], _twos[7]), + CreateEntityOneEntityTwo(context, _ones[12], _twos[8]), + CreateEntityOneEntityTwo(context, _ones[12], _twos[12]), + CreateEntityOneEntityTwo(context, _ones[13], _twos[3]), + CreateEntityOneEntityTwo(context, _ones[13], _twos[8]), + CreateEntityOneEntityTwo(context, _ones[13], _twos[18]), + CreateEntityOneEntityTwo(context, _ones[14], _twos[9]), + CreateEntityOneEntityTwo(context, _ones[15], _twos[0]), + CreateEntityOneEntityTwo(context, _ones[15], _twos[6]), + CreateEntityOneEntityTwo(context, _ones[15], _twos[18]), + CreateEntityOneEntityTwo(context, _ones[16], _twos[7]), + CreateEntityOneEntityTwo(context, _ones[16], _twos[14]), + CreateEntityOneEntityTwo(context, _ones[17], _twos[3]), + CreateEntityOneEntityTwo(context, _ones[17], _twos[12]), + CreateEntityOneEntityTwo(context, _ones[17], _twos[13]), + CreateEntityOneEntityTwo(context, _ones[18], _twos[3]), + CreateEntityOneEntityTwo(context, _ones[18], _twos[13]) }; private static Dictionary CreateEntityOneEntityTwo( ManyToManyContext context, - int oneId, - int twoId) - => CreateInstance( + EntityOne one, + EntityTwo two) + { + return CreateInstance( context?.Set>("EntityOneEntityTwo"), (e, p) => { - e["EntityOneId"] = oneId; - e["EntityTwoId"] = twoId; + e["EntityOneId"] = context?.Entry(one).Property(e => e.Id).CurrentValue ?? one.Id; + e["EntityTwoId"] = context?.Entry(two).Property(e => e.Id).CurrentValue ?? two.Id; }); + } - private static Dictionary[] CreateJoinOneToThreePayloadFullShareds(ManyToManyContext context) + private Dictionary[] CreateJoinOneToThreePayloadFullShareds(ManyToManyContext context) => new[] { - CreateJoinOneToThreePayloadFullShared(context, 3, 1, "Capbrough"), - CreateJoinOneToThreePayloadFullShared(context, 3, 2, "East Eastdol"), - CreateJoinOneToThreePayloadFullShared(context, 3, 4, "Southingville"), - CreateJoinOneToThreePayloadFullShared(context, 3, 9, "Goldbrough"), - CreateJoinOneToThreePayloadFullShared(context, 4, 5, "Readingworth"), - CreateJoinOneToThreePayloadFullShared(context, 4, 18, "Skillpool"), - CreateJoinOneToThreePayloadFullShared(context, 5, 1, "Lawgrad"), - CreateJoinOneToThreePayloadFullShared(context, 5, 4, "Kettleham Park"), - CreateJoinOneToThreePayloadFullShared(context, 5, 9, "Sayford Park"), - CreateJoinOneToThreePayloadFullShared(context, 5, 16, "Hamstead"), - CreateJoinOneToThreePayloadFullShared(context, 6, 11, "North Starside"), - CreateJoinOneToThreePayloadFullShared(context, 6, 13, "Goldfolk"), - CreateJoinOneToThreePayloadFullShared(context, 7, 4, "Winstead"), - CreateJoinOneToThreePayloadFullShared(context, 8, 11, "Transworth"), - CreateJoinOneToThreePayloadFullShared(context, 8, 18, "Parkpool"), - CreateJoinOneToThreePayloadFullShared(context, 8, 19, "Fishham"), - CreateJoinOneToThreePayloadFullShared(context, 10, 1, "Passmouth"), - CreateJoinOneToThreePayloadFullShared(context, 10, 5, "Valenfield"), - CreateJoinOneToThreePayloadFullShared(context, 10, 20, "Passford Park"), - CreateJoinOneToThreePayloadFullShared(context, 11, 10, "Chatfield"), - CreateJoinOneToThreePayloadFullShared(context, 12, 11, "Hosview"), - CreateJoinOneToThreePayloadFullShared(context, 12, 17, "Dodgewich"), - CreateJoinOneToThreePayloadFullShared(context, 13, 3, "Skillhampton"), - CreateJoinOneToThreePayloadFullShared(context, 13, 14, "Hardcaster"), - CreateJoinOneToThreePayloadFullShared(context, 13, 16, "Hollowmouth"), - CreateJoinOneToThreePayloadFullShared(context, 14, 6, "Cruxcaster"), - CreateJoinOneToThreePayloadFullShared(context, 14, 11, "Elcaster"), - CreateJoinOneToThreePayloadFullShared(context, 14, 17, "Clambrough"), - CreateJoinOneToThreePayloadFullShared(context, 15, 10, "Millwich"), - CreateJoinOneToThreePayloadFullShared(context, 15, 13, "Hapcester"), - CreateJoinOneToThreePayloadFullShared(context, 16, 7, "Sanddol Beach"), - CreateJoinOneToThreePayloadFullShared(context, 16, 13, "Hamcaster"), - CreateJoinOneToThreePayloadFullShared(context, 17, 9, "New Foxbrough"), - CreateJoinOneToThreePayloadFullShared(context, 17, 13, "Chatpool"), - CreateJoinOneToThreePayloadFullShared(context, 18, 8, "Duckworth"), - CreateJoinOneToThreePayloadFullShared(context, 18, 12, "Snowham"), - CreateJoinOneToThreePayloadFullShared(context, 18, 13, "Bannview Island"), - CreateJoinOneToThreePayloadFullShared(context, 20, 4, "Rockbrough"), - CreateJoinOneToThreePayloadFullShared(context, 20, 5, "Sweetfield"), - CreateJoinOneToThreePayloadFullShared(context, 20, 16, "Bayburgh Hills") + CreateJoinOneToThreePayloadFullShared(context, _ones[2], _threes[0], "Capbrough"), + CreateJoinOneToThreePayloadFullShared(context, _ones[2], _threes[1], "East Eastdol"), + CreateJoinOneToThreePayloadFullShared(context, _ones[2], _threes[3], "Southingville"), + CreateJoinOneToThreePayloadFullShared(context, _ones[2], _threes[8], "Goldbrough"), + CreateJoinOneToThreePayloadFullShared(context, _ones[3], _threes[4], "Readingworth"), + CreateJoinOneToThreePayloadFullShared(context, _ones[3], _threes[17], "Skillpool"), + CreateJoinOneToThreePayloadFullShared(context, _ones[4], _threes[0], "Lawgrad"), + CreateJoinOneToThreePayloadFullShared(context, _ones[4], _threes[3], "Kettleham Park"), + CreateJoinOneToThreePayloadFullShared(context, _ones[4], _threes[8], "Sayford Park"), + CreateJoinOneToThreePayloadFullShared(context, _ones[4], _threes[15], "Hamstead"), + CreateJoinOneToThreePayloadFullShared(context, _ones[5], _threes[10], "North Starside"), + CreateJoinOneToThreePayloadFullShared(context, _ones[5], _threes[12], "Goldfolk"), + CreateJoinOneToThreePayloadFullShared(context, _ones[6], _threes[3], "Winstead"), + CreateJoinOneToThreePayloadFullShared(context, _ones[7], _threes[10], "Transworth"), + CreateJoinOneToThreePayloadFullShared(context, _ones[7], _threes[17], "Parkpool"), + CreateJoinOneToThreePayloadFullShared(context, _ones[7], _threes[18], "Fishham"), + CreateJoinOneToThreePayloadFullShared(context, _ones[9], _threes[0], "Passmouth"), + CreateJoinOneToThreePayloadFullShared(context, _ones[9], _threes[4], "Valenfield"), + CreateJoinOneToThreePayloadFullShared(context, _ones[9], _threes[19], "Passford Park"), + CreateJoinOneToThreePayloadFullShared(context, _ones[10], _threes[9], "Chatfield"), + CreateJoinOneToThreePayloadFullShared(context, _ones[11], _threes[10], "Hosview"), + CreateJoinOneToThreePayloadFullShared(context, _ones[11], _threes[16], "Dodgewich"), + CreateJoinOneToThreePayloadFullShared(context, _ones[12], _threes[2], "Skillhampton"), + CreateJoinOneToThreePayloadFullShared(context, _ones[12], _threes[13], "Hardcaster"), + CreateJoinOneToThreePayloadFullShared(context, _ones[12], _threes[15], "Hollowmouth"), + CreateJoinOneToThreePayloadFullShared(context, _ones[13], _threes[5], "Cruxcaster"), + CreateJoinOneToThreePayloadFullShared(context, _ones[13], _threes[10], "Elcaster"), + CreateJoinOneToThreePayloadFullShared(context, _ones[13], _threes[16], "Clambrough"), + CreateJoinOneToThreePayloadFullShared(context, _ones[14], _threes[9], "Millwich"), + CreateJoinOneToThreePayloadFullShared(context, _ones[14], _threes[12], "Hapcester"), + CreateJoinOneToThreePayloadFullShared(context, _ones[15], _threes[6], "Sanddol Beach"), + CreateJoinOneToThreePayloadFullShared(context, _ones[15], _threes[12], "Hamcaster"), + CreateJoinOneToThreePayloadFullShared(context, _ones[16], _threes[8], "New Foxbrough"), + CreateJoinOneToThreePayloadFullShared(context, _ones[16], _threes[12], "Chatpool"), + CreateJoinOneToThreePayloadFullShared(context, _ones[17], _threes[7], "Duckworth"), + CreateJoinOneToThreePayloadFullShared(context, _ones[17], _threes[11], "Snowham"), + CreateJoinOneToThreePayloadFullShared(context, _ones[17], _threes[12], "Bannview Island"), + CreateJoinOneToThreePayloadFullShared(context, _ones[19], _threes[3], "Rockbrough"), + CreateJoinOneToThreePayloadFullShared(context, _ones[19], _threes[4], "Sweetfield"), + CreateJoinOneToThreePayloadFullShared(context, _ones[19], _threes[15], "Bayburgh Hills") }; private static Dictionary CreateJoinOneToThreePayloadFullShared( ManyToManyContext context, - int oneId, - int threeId, + EntityOne one, + EntityThree three, string payload) => CreateInstance( context?.Set>("JoinOneToThreePayloadFullShared"), (e, p) => { - e["OneId"] = oneId; - e["ThreeId"] = threeId; + e["OneId"] = context?.Entry(one).Property(e => e.Id).CurrentValue ?? one.Id; + e["ThreeId"] = context?.Entry(three).Property(e => e.Id).CurrentValue ?? three.Id; e["Payload"] = payload; }); - private static Dictionary[] CreateJoinTwoSelfShareds(ManyToManyContext context) + private Dictionary[] CreateJoinTwoSelfShareds(ManyToManyContext context) => new[] { - CreateJoinTwoSelfShared(context, 1, 9), - CreateJoinTwoSelfShared(context, 1, 10), - CreateJoinTwoSelfShared(context, 1, 11), - CreateJoinTwoSelfShared(context, 1, 18), - CreateJoinTwoSelfShared(context, 3, 2), - CreateJoinTwoSelfShared(context, 3, 5), - CreateJoinTwoSelfShared(context, 3, 8), - CreateJoinTwoSelfShared(context, 3, 18), - CreateJoinTwoSelfShared(context, 3, 19), - CreateJoinTwoSelfShared(context, 4, 11), - CreateJoinTwoSelfShared(context, 5, 8), - CreateJoinTwoSelfShared(context, 6, 18), - CreateJoinTwoSelfShared(context, 8, 2), - CreateJoinTwoSelfShared(context, 8, 14), - CreateJoinTwoSelfShared(context, 8, 15), - CreateJoinTwoSelfShared(context, 8, 20), - CreateJoinTwoSelfShared(context, 9, 4), - CreateJoinTwoSelfShared(context, 9, 14), - CreateJoinTwoSelfShared(context, 10, 5), - CreateJoinTwoSelfShared(context, 12, 13), - CreateJoinTwoSelfShared(context, 12, 14), - CreateJoinTwoSelfShared(context, 13, 14), - CreateJoinTwoSelfShared(context, 13, 18), - CreateJoinTwoSelfShared(context, 13, 19), - CreateJoinTwoSelfShared(context, 16, 6), - CreateJoinTwoSelfShared(context, 17, 9), - CreateJoinTwoSelfShared(context, 17, 19), - CreateJoinTwoSelfShared(context, 17, 20), - CreateJoinTwoSelfShared(context, 18, 2), - CreateJoinTwoSelfShared(context, 18, 5), - CreateJoinTwoSelfShared(context, 18, 16), - CreateJoinTwoSelfShared(context, 18, 17), - CreateJoinTwoSelfShared(context, 19, 2), - CreateJoinTwoSelfShared(context, 20, 4) + CreateJoinTwoSelfShared(context, _twos[0], _twos[8]), + CreateJoinTwoSelfShared(context, _twos[0], _twos[9]), + CreateJoinTwoSelfShared(context, _twos[0], _twos[10]), + CreateJoinTwoSelfShared(context, _twos[0], _twos[17]), + CreateJoinTwoSelfShared(context, _twos[2], _twos[1]), + CreateJoinTwoSelfShared(context, _twos[2], _twos[4]), + CreateJoinTwoSelfShared(context, _twos[2], _twos[7]), + CreateJoinTwoSelfShared(context, _twos[2], _twos[17]), + CreateJoinTwoSelfShared(context, _twos[2], _twos[18]), + CreateJoinTwoSelfShared(context, _twos[3], _twos[10]), + CreateJoinTwoSelfShared(context, _twos[4], _twos[7]), + CreateJoinTwoSelfShared(context, _twos[5], _twos[17]), + CreateJoinTwoSelfShared(context, _twos[7], _twos[1]), + CreateJoinTwoSelfShared(context, _twos[7], _twos[13]), + CreateJoinTwoSelfShared(context, _twos[7], _twos[14]), + CreateJoinTwoSelfShared(context, _twos[7], _twos[19]), + CreateJoinTwoSelfShared(context, _twos[8], _twos[3]), + CreateJoinTwoSelfShared(context, _twos[8], _twos[13]), + CreateJoinTwoSelfShared(context, _twos[9], _twos[4]), + CreateJoinTwoSelfShared(context, _twos[11], _twos[12]), + CreateJoinTwoSelfShared(context, _twos[11], _twos[13]), + CreateJoinTwoSelfShared(context, _twos[12], _twos[13]), + CreateJoinTwoSelfShared(context, _twos[12], _twos[17]), + CreateJoinTwoSelfShared(context, _twos[12], _twos[18]), + CreateJoinTwoSelfShared(context, _twos[15], _twos[5]), + CreateJoinTwoSelfShared(context, _twos[16], _twos[8]), + CreateJoinTwoSelfShared(context, _twos[16], _twos[18]), + CreateJoinTwoSelfShared(context, _twos[16], _twos[19]), + CreateJoinTwoSelfShared(context, _twos[17], _twos[1]), + CreateJoinTwoSelfShared(context, _twos[17], _twos[4]), + CreateJoinTwoSelfShared(context, _twos[17], _twos[15]), + CreateJoinTwoSelfShared(context, _twos[17], _twos[16]), + CreateJoinTwoSelfShared(context, _twos[18], _twos[1]), + CreateJoinTwoSelfShared(context, _twos[19], _twos[3]) }; private static Dictionary CreateJoinTwoSelfShared( ManyToManyContext context, - int leftId, - int rightId) + EntityTwo left, + EntityTwo right) => CreateInstance( context?.Set>("JoinTwoSelfShared"), (e, p) => { - e["LeftId"] = leftId; - e["RightId"] = rightId; + e["LeftId"] = context?.Entry(left).Property(e => e.Id).CurrentValue ?? left.Id; + e["RightId"] = context?.Entry(right).Property(e => e.Id).CurrentValue ?? right.Id; }); - private static Dictionary[] CreateJoinTwoToCompositeKeyShareds(ManyToManyContext context) + private Dictionary[] CreateJoinTwoToCompositeKeyShareds(ManyToManyContext context) => new[] { - CreateJoinTwoToCompositeKeyShared(context, 1, 1, "1_1", new DateTime(2001, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 1, 3, "3_2", new DateTime(2003, 2, 1)), - CreateJoinTwoToCompositeKeyShared(context, 1, 3, "3_3", new DateTime(2003, 3, 1)), - CreateJoinTwoToCompositeKeyShared(context, 2, 3, "3_2", new DateTime(2003, 2, 1)), - CreateJoinTwoToCompositeKeyShared(context, 3, 6, "6_1", new DateTime(2006, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 4, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinTwoToCompositeKeyShared(context, 4, 9, "9_6", new DateTime(2009, 6, 1)), - CreateJoinTwoToCompositeKeyShared(context, 6, 3, "3_1", new DateTime(2003, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 6, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinTwoToCompositeKeyShared(context, 7, 7, "7_2", new DateTime(2007, 2, 1)), - CreateJoinTwoToCompositeKeyShared(context, 9, 3, "3_1", new DateTime(2003, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 9, 8, "8_1", new DateTime(2008, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 10, 1, "1_1", new DateTime(2001, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 10, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinTwoToCompositeKeyShared(context, 10, 9, "9_5", new DateTime(2009, 5, 1)), - CreateJoinTwoToCompositeKeyShared(context, 11, 1, "1_1", new DateTime(2001, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 11, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinTwoToCompositeKeyShared(context, 12, 7, "7_2", new DateTime(2007, 2, 1)), - CreateJoinTwoToCompositeKeyShared(context, 12, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinTwoToCompositeKeyShared(context, 12, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinTwoToCompositeKeyShared(context, 13, 1, "1_1", new DateTime(2001, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 13, 7, "7_1", new DateTime(2007, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 13, 9, "9_4", new DateTime(2009, 4, 1)), - CreateJoinTwoToCompositeKeyShared(context, 15, 9, "9_3", new DateTime(2009, 3, 1)), - CreateJoinTwoToCompositeKeyShared(context, 16, 1, "1_1", new DateTime(2001, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 16, 3, "3_1", new DateTime(2003, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 16, 9, "9_6", new DateTime(2009, 6, 1)), - CreateJoinTwoToCompositeKeyShared(context, 17, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinTwoToCompositeKeyShared(context, 17, 7, "7_2", new DateTime(2007, 2, 1)), - CreateJoinTwoToCompositeKeyShared(context, 17, 9, "9_1", new DateTime(2009, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 17, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinTwoToCompositeKeyShared(context, 19, 3, "3_3", new DateTime(2003, 3, 1)), - CreateJoinTwoToCompositeKeyShared(context, 20, 3, "3_1", new DateTime(2003, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 20, 3, "3_3", new DateTime(2003, 3, 1)), - CreateJoinTwoToCompositeKeyShared(context, 20, 6, "6_1", new DateTime(2006, 1, 1)), - CreateJoinTwoToCompositeKeyShared(context, 20, 9, "9_1", new DateTime(2009, 1, 1)) + CreateJoinTwoToCompositeKeyShared(context, _twos[0], _compositeKeys[0]), + CreateJoinTwoToCompositeKeyShared(context, _twos[0], _compositeKeys[3]), + CreateJoinTwoToCompositeKeyShared(context, _twos[0], _compositeKeys[4]), + CreateJoinTwoToCompositeKeyShared(context, _twos[1], _compositeKeys[3]), + CreateJoinTwoToCompositeKeyShared(context, _twos[2], _compositeKeys[5]), + CreateJoinTwoToCompositeKeyShared(context, _twos[3], _compositeKeys[1]), + CreateJoinTwoToCompositeKeyShared(context, _twos[3], _compositeKeys[18]), + CreateJoinTwoToCompositeKeyShared(context, _twos[5], _compositeKeys[2]), + CreateJoinTwoToCompositeKeyShared(context, _twos[5], _compositeKeys[12]), + CreateJoinTwoToCompositeKeyShared(context, _twos[6], _compositeKeys[7]), + CreateJoinTwoToCompositeKeyShared(context, _twos[8], _compositeKeys[2]), + CreateJoinTwoToCompositeKeyShared(context, _twos[8], _compositeKeys[8]), + CreateJoinTwoToCompositeKeyShared(context, _twos[9], _compositeKeys[0]), + CreateJoinTwoToCompositeKeyShared(context, _twos[9], _compositeKeys[14]), + CreateJoinTwoToCompositeKeyShared(context, _twos[9], _compositeKeys[17]), + CreateJoinTwoToCompositeKeyShared(context, _twos[10], _compositeKeys[0]), + CreateJoinTwoToCompositeKeyShared(context, _twos[10], _compositeKeys[14]), + CreateJoinTwoToCompositeKeyShared(context, _twos[11], _compositeKeys[7]), + CreateJoinTwoToCompositeKeyShared(context, _twos[11], _compositeKeys[12]), + CreateJoinTwoToCompositeKeyShared(context, _twos[11], _compositeKeys[14]), + CreateJoinTwoToCompositeKeyShared(context, _twos[12], _compositeKeys[0]), + CreateJoinTwoToCompositeKeyShared(context, _twos[12], _compositeKeys[6]), + CreateJoinTwoToCompositeKeyShared(context, _twos[12], _compositeKeys[16]), + CreateJoinTwoToCompositeKeyShared(context, _twos[14], _compositeKeys[15]), + CreateJoinTwoToCompositeKeyShared(context, _twos[15], _compositeKeys[0]), + CreateJoinTwoToCompositeKeyShared(context, _twos[15], _compositeKeys[2]), + CreateJoinTwoToCompositeKeyShared(context, _twos[15], _compositeKeys[18]), + CreateJoinTwoToCompositeKeyShared(context, _twos[16], _compositeKeys[1]), + CreateJoinTwoToCompositeKeyShared(context, _twos[16], _compositeKeys[7]), + CreateJoinTwoToCompositeKeyShared(context, _twos[16], _compositeKeys[13]), + CreateJoinTwoToCompositeKeyShared(context, _twos[16], _compositeKeys[14]), + CreateJoinTwoToCompositeKeyShared(context, _twos[18], _compositeKeys[4]), + CreateJoinTwoToCompositeKeyShared(context, _twos[19], _compositeKeys[2]), + CreateJoinTwoToCompositeKeyShared(context, _twos[19], _compositeKeys[4]), + CreateJoinTwoToCompositeKeyShared(context, _twos[19], _compositeKeys[5]), + CreateJoinTwoToCompositeKeyShared(context, _twos[19], _compositeKeys[13]) }; private static Dictionary CreateJoinTwoToCompositeKeyShared( ManyToManyContext context, - int twoId, - int compositeId1, - string compositeId2, - DateTime compositeId3) + EntityTwo two, + EntityCompositeKey composite) => CreateInstance( context?.Set>("JoinTwoToCompositeKeyShared"), (e, p) => { - e["TwoId"] = twoId; - e["CompositeId1"] = compositeId1; - e["CompositeId2"] = compositeId2; - e["CompositeId3"] = compositeId3; + e["TwoId"] = context?.Entry(two).Property(e => e.Id).CurrentValue ?? two.Id; + e["CompositeId1"] = context?.Entry(composite).Property(e => e.Key1).CurrentValue ?? composite.Key1; + e["CompositeId2"] = composite.Key2; + e["CompositeId3"] = composite.Key3; }); - private static Dictionary[] CreateEntityRootEntityThrees(ManyToManyContext context) + private Dictionary[] CreateEntityRootEntityThrees(ManyToManyContext context) => new[] { - CreateEntityRootEntityThree(context, 1, 7), - CreateEntityRootEntityThree(context, 1, 8), - CreateEntityRootEntityThree(context, 1, 15), - CreateEntityRootEntityThree(context, 2, 4), - CreateEntityRootEntityThree(context, 2, 16), - CreateEntityRootEntityThree(context, 3, 12), - CreateEntityRootEntityThree(context, 3, 14), - CreateEntityRootEntityThree(context, 3, 24), - CreateEntityRootEntityThree(context, 5, 14), - CreateEntityRootEntityThree(context, 5, 15), - CreateEntityRootEntityThree(context, 5, 16), - CreateEntityRootEntityThree(context, 6, 21), - CreateEntityRootEntityThree(context, 7, 1), - CreateEntityRootEntityThree(context, 7, 6), - CreateEntityRootEntityThree(context, 7, 13), - CreateEntityRootEntityThree(context, 7, 24), - CreateEntityRootEntityThree(context, 8, 10), - CreateEntityRootEntityThree(context, 10, 3), - CreateEntityRootEntityThree(context, 10, 8), - CreateEntityRootEntityThree(context, 13, 5), - CreateEntityRootEntityThree(context, 14, 1), - CreateEntityRootEntityThree(context, 14, 14), - CreateEntityRootEntityThree(context, 16, 5), - CreateEntityRootEntityThree(context, 16, 7), - CreateEntityRootEntityThree(context, 17, 14), - CreateEntityRootEntityThree(context, 18, 6), - CreateEntityRootEntityThree(context, 18, 23), - CreateEntityRootEntityThree(context, 19, 11), - CreateEntityRootEntityThree(context, 20, 14) + CreateEntityRootEntityThree(context, _threes[0], _roots[6]), + CreateEntityRootEntityThree(context, _threes[0], _roots[7]), + CreateEntityRootEntityThree(context, _threes[0], _roots[14]), + CreateEntityRootEntityThree(context, _threes[1], _roots[3]), + CreateEntityRootEntityThree(context, _threes[1], _roots[15]), + CreateEntityRootEntityThree(context, _threes[2], _roots[11]), + CreateEntityRootEntityThree(context, _threes[2], _roots[13]), + CreateEntityRootEntityThree(context, _threes[2], _roots[19]), + CreateEntityRootEntityThree(context, _threes[4], _roots[13]), + CreateEntityRootEntityThree(context, _threes[4], _roots[14]), + CreateEntityRootEntityThree(context, _threes[4], _roots[15]), + CreateEntityRootEntityThree(context, _threes[5], _roots[16]), + CreateEntityRootEntityThree(context, _threes[6], _roots[0]), + CreateEntityRootEntityThree(context, _threes[6], _roots[5]), + CreateEntityRootEntityThree(context, _threes[6], _roots[12]), + CreateEntityRootEntityThree(context, _threes[6], _roots[19]), + CreateEntityRootEntityThree(context, _threes[7], _roots[9]), + CreateEntityRootEntityThree(context, _threes[9], _roots[2]), + CreateEntityRootEntityThree(context, _threes[9], _roots[7]), + CreateEntityRootEntityThree(context, _threes[12], _roots[4]), + CreateEntityRootEntityThree(context, _threes[13], _roots[0]), + CreateEntityRootEntityThree(context, _threes[13], _roots[13]), + CreateEntityRootEntityThree(context, _threes[15], _roots[4]), + CreateEntityRootEntityThree(context, _threes[15], _roots[6]), + CreateEntityRootEntityThree(context, _threes[16], _roots[13]), + CreateEntityRootEntityThree(context, _threes[17], _roots[5]), + CreateEntityRootEntityThree(context, _threes[17], _roots[18]), + CreateEntityRootEntityThree(context, _threes[18], _roots[10]), + CreateEntityRootEntityThree(context, _threes[19], _roots[13]) }; private static Dictionary CreateEntityRootEntityThree( ManyToManyContext context, - int threeId, - int rootId) + EntityThree three, + EntityRoot root) => CreateInstance( context?.Set>("EntityRootEntityThree"), (e, p) => { - e["EntityThreeId"] = threeId; - e["EntityRootId"] = rootId; + e["EntityThreeId"] = context?.Entry(three).Property(e => e.Id).CurrentValue ?? three.Id; + e["EntityRootId"] = context?.Entry(root).Property(e => e.Id).CurrentValue ?? root.Id; }); - private static Dictionary[] CreateJoinCompositeKeyToRootShareds(ManyToManyContext context) + private Dictionary[] CreateJoinCompositeKeyToRootShareds(ManyToManyContext context) => new[] { - CreateJoinCompositeKeyToRootShared(context, 6, 1, "1_1", new DateTime(2001, 1, 1)), - CreateJoinCompositeKeyToRootShared(context, 9, 1, "1_1", new DateTime(2001, 1, 1)), - CreateJoinCompositeKeyToRootShared(context, 24, 1, "1_1", new DateTime(2001, 1, 1)), - CreateJoinCompositeKeyToRootShared(context, 1, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 2, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 4, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 6, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 11, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 22, 1, "1_2", new DateTime(2001, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 4, 3, "3_1", new DateTime(2003, 1, 1)), - CreateJoinCompositeKeyToRootShared(context, 14, 3, "3_1", new DateTime(2003, 1, 1)), - CreateJoinCompositeKeyToRootShared(context, 16, 3, "3_1", new DateTime(2003, 1, 1)), - CreateJoinCompositeKeyToRootShared(context, 2, 3, "3_2", new DateTime(2003, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 3, 3, "3_2", new DateTime(2003, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 4, 3, "3_2", new DateTime(2003, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 2, 7, "7_2", new DateTime(2007, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 8, 7, "7_2", new DateTime(2007, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 16, 7, "7_2", new DateTime(2007, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 22, 7, "7_2", new DateTime(2007, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 7, 8, "8_1", new DateTime(2008, 1, 1)), - CreateJoinCompositeKeyToRootShared(context, 8, 8, "8_1", new DateTime(2008, 1, 1)), - CreateJoinCompositeKeyToRootShared(context, 23, 8, "8_1", new DateTime(2008, 1, 1)), - CreateJoinCompositeKeyToRootShared(context, 3, 8, "8_2", new DateTime(2008, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 12, 8, "8_2", new DateTime(2008, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 22, 8, "8_2", new DateTime(2008, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 2, 8, "8_3", new DateTime(2008, 3, 1)), - CreateJoinCompositeKeyToRootShared(context, 4, 8, "8_3", new DateTime(2008, 3, 1)), - CreateJoinCompositeKeyToRootShared(context, 5, 8, "8_3", new DateTime(2008, 3, 1)), - CreateJoinCompositeKeyToRootShared(context, 7, 8, "8_4", new DateTime(2008, 4, 1)), - CreateJoinCompositeKeyToRootShared(context, 3, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinCompositeKeyToRootShared(context, 8, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinCompositeKeyToRootShared(context, 14, 8, "8_5", new DateTime(2008, 5, 1)), - CreateJoinCompositeKeyToRootShared(context, 4, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 11, 9, "9_2", new DateTime(2009, 2, 1)), - CreateJoinCompositeKeyToRootShared(context, 1, 9, "9_3", new DateTime(2009, 3, 1)), - CreateJoinCompositeKeyToRootShared(context, 7, 9, "9_3", new DateTime(2009, 3, 1)), - CreateJoinCompositeKeyToRootShared(context, 15, 9, "9_3", new DateTime(2009, 3, 1)), - CreateJoinCompositeKeyToRootShared(context, 1, 9, "9_6", new DateTime(2009, 6, 1)), - CreateJoinCompositeKeyToRootShared(context, 6, 9, "9_7", new DateTime(2009, 7, 1)) + CreateJoinCompositeKeyToRootShared(context, _roots[5], _compositeKeys[0]), + CreateJoinCompositeKeyToRootShared(context, _roots[8], _compositeKeys[0]), + CreateJoinCompositeKeyToRootShared(context, _roots[19], _compositeKeys[0]), + CreateJoinCompositeKeyToRootShared(context, _roots[0], _compositeKeys[1]), + CreateJoinCompositeKeyToRootShared(context, _roots[1], _compositeKeys[1]), + CreateJoinCompositeKeyToRootShared(context, _roots[3], _compositeKeys[1]), + CreateJoinCompositeKeyToRootShared(context, _roots[5], _compositeKeys[1]), + CreateJoinCompositeKeyToRootShared(context, _roots[10], _compositeKeys[1]), + CreateJoinCompositeKeyToRootShared(context, _roots[17], _compositeKeys[1]), + CreateJoinCompositeKeyToRootShared(context, _roots[3], _compositeKeys[2]), + CreateJoinCompositeKeyToRootShared(context, _roots[13], _compositeKeys[2]), + CreateJoinCompositeKeyToRootShared(context, _roots[15], _compositeKeys[2]), + CreateJoinCompositeKeyToRootShared(context, _roots[1], _compositeKeys[3]), + CreateJoinCompositeKeyToRootShared(context, _roots[2], _compositeKeys[3]), + CreateJoinCompositeKeyToRootShared(context, _roots[3], _compositeKeys[3]), + CreateJoinCompositeKeyToRootShared(context, _roots[1], _compositeKeys[7]), + CreateJoinCompositeKeyToRootShared(context, _roots[7], _compositeKeys[7]), + CreateJoinCompositeKeyToRootShared(context, _roots[15], _compositeKeys[7]), + CreateJoinCompositeKeyToRootShared(context, _roots[17], _compositeKeys[7]), + CreateJoinCompositeKeyToRootShared(context, _roots[6], _compositeKeys[8]), + CreateJoinCompositeKeyToRootShared(context, _roots[7], _compositeKeys[8]), + CreateJoinCompositeKeyToRootShared(context, _roots[18], _compositeKeys[8]), + CreateJoinCompositeKeyToRootShared(context, _roots[2], _compositeKeys[9]), + CreateJoinCompositeKeyToRootShared(context, _roots[11], _compositeKeys[9]), + CreateJoinCompositeKeyToRootShared(context, _roots[17], _compositeKeys[9]), + CreateJoinCompositeKeyToRootShared(context, _roots[1], _compositeKeys[10]), + CreateJoinCompositeKeyToRootShared(context, _roots[3], _compositeKeys[10]), + CreateJoinCompositeKeyToRootShared(context, _roots[4], _compositeKeys[10]), + CreateJoinCompositeKeyToRootShared(context, _roots[6], _compositeKeys[11]), + CreateJoinCompositeKeyToRootShared(context, _roots[2], _compositeKeys[12]), + CreateJoinCompositeKeyToRootShared(context, _roots[7], _compositeKeys[12]), + CreateJoinCompositeKeyToRootShared(context, _roots[13], _compositeKeys[12]), + CreateJoinCompositeKeyToRootShared(context, _roots[3], _compositeKeys[14]), + CreateJoinCompositeKeyToRootShared(context, _roots[10], _compositeKeys[14]), + CreateJoinCompositeKeyToRootShared(context, _roots[0], _compositeKeys[15]), + CreateJoinCompositeKeyToRootShared(context, _roots[6], _compositeKeys[15]), + CreateJoinCompositeKeyToRootShared(context, _roots[14], _compositeKeys[15]), + CreateJoinCompositeKeyToRootShared(context, _roots[0], _compositeKeys[18]), + CreateJoinCompositeKeyToRootShared(context, _roots[5], _compositeKeys[19]) }; private static ICollection CreateCollection(bool proxy) @@ -1428,17 +1218,15 @@ private static ICollection CreateCollection(bool proxy) private static Dictionary CreateJoinCompositeKeyToRootShared( ManyToManyContext context, - int rootId, - int compositeId1, - string compositeId2, - DateTime compositeId3) + EntityRoot root, + EntityCompositeKey composite) => CreateInstance( context?.Set>("JoinCompositeKeyToRootShared"), (e, p) => { - e["RootId"] = rootId; - e["CompositeId1"] = compositeId1; - e["CompositeId2"] = compositeId2; - e["CompositeId3"] = compositeId3; + e["RootId"] = context?.Entry(root).Property(e => e.Id).CurrentValue ?? root.Id; + e["CompositeId1"] = context?.Entry(composite).Property(e => e.Key1).CurrentValue ?? composite.Key1; + e["CompositeId2"] = composite.Key2; + e["CompositeId3"] = composite.Key3; }); private static TEntity CreateInstance(DbSet set, Action configureEntity) diff --git a/test/EFCore.SqlServer.FunctionalTests/ManyToManyTrackingGeneratedKeysSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/ManyToManyTrackingGeneratedKeysSqlServerTest.cs new file mode 100644 index 00000000000..a236bdb26e6 --- /dev/null +++ b/test/EFCore.SqlServer.FunctionalTests/ManyToManyTrackingGeneratedKeysSqlServerTest.cs @@ -0,0 +1,38 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.EntityFrameworkCore.TestModels.ManyToManyModel; + +namespace Microsoft.EntityFrameworkCore +{ + public class ManyToManyTrackingGeneratedKeysSqlServerTest + : ManyToManyTrackingSqlServerTestBase + { + public ManyToManyTrackingGeneratedKeysSqlServerTest(ManyToManyTrackingGeneratedKeysSqlServerFixture fixture) + : base(fixture) + { + } + + public class ManyToManyTrackingGeneratedKeysSqlServerFixture : ManyToManyTrackingSqlServerFixtureBase + { + protected override string StoreName { get; } = "ManyToManyTrackingGeneratedKeys"; + + public override bool UseGeneratedKeys + => true; + + protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext context) + { + base.OnModelCreating(modelBuilder, context); + + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Key1).ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.SharedTypeEntity("PST").IndexerProperty("Id").ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + } + } + } +} diff --git a/test/EFCore.SqlServer.FunctionalTests/ManyToManyTrackingProxyGeneratedKeysSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/ManyToManyTrackingProxyGeneratedKeysSqlServerTest.cs new file mode 100644 index 00000000000..4892d355033 --- /dev/null +++ b/test/EFCore.SqlServer.FunctionalTests/ManyToManyTrackingProxyGeneratedKeysSqlServerTest.cs @@ -0,0 +1,71 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore.TestModels.ManyToManyModel; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.EntityFrameworkCore +{ + public class ManyToManyTrackingProxyGeneratedKeysSqlServerTest + : ManyToManyTrackingSqlServerTestBase< + ManyToManyTrackingProxyGeneratedKeysSqlServerTest.ManyToManyTrackingProxyGeneratedKeysSqlServerFixture> + { + public ManyToManyTrackingProxyGeneratedKeysSqlServerTest(ManyToManyTrackingProxyGeneratedKeysSqlServerFixture fixture) + : base(fixture) + { + } + + public override Task Can_insert_many_to_many_shared_with_payload(bool async) + { + // Mutable properties aren't proxyable on Dictionary + return Task.CompletedTask; + } + + public override void Can_update_many_to_many_shared_with_payload() + { + // Mutable properties aren't proxyable on Dictionary + } + + public override void Can_insert_update_delete_shared_type_entity_type() + { + // Mutable properties aren't proxyable on Dictionary + } + + protected override bool RequiresDetectChanges + => false; + + public class ManyToManyTrackingProxyGeneratedKeysSqlServerFixture : ManyToManyTrackingSqlServerFixtureBase + { + protected override string StoreName { get; } = "ManyToManyTrackingProxyGeneratedKeys"; + + public override DbContextOptionsBuilder AddOptions(DbContextOptionsBuilder builder) + => base.AddOptions(builder).UseChangeTrackingProxies(); + + protected override IServiceCollection AddServices(IServiceCollection serviceCollection) + => base.AddServices(serviceCollection.AddEntityFrameworkProxies()); + + public override bool UseGeneratedKeys + => true; + + protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext context) + { + base.OnModelCreating(modelBuilder, context); + + modelBuilder + .SharedTypeEntity>("JoinOneToThreePayloadFullShared") + .Ignore("Payload"); // Mutable properties aren't proxyable on Dictionary + + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Key1).ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.SharedTypeEntity("PST").IndexerProperty("Id").ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + } + } + } +}