private void Principal_nav_set_bidirectional_impl(EntityState entityState, bool?graph)
        {
            using (var context = new FixupContext())
            {
                var principal = new Parent {
                    Id = 77
                };
                if (graph == null)
                {
                    context.Entry(principal).State = entityState;
                }
                var dependent = new Child {
                    Name = "1"
                };
                principal.Child1 = dependent;

                if (graph == null)
                {
                    context.ChangeTracker.DetectChanges();
                }
                else if (graph == true)
                {
                    context.ChangeTracker.TrackGraph(principal, e => e.Entry.State = entityState);
                }
                else
                {
                    switch (entityState)
                    {
                    case EntityState.Added:
                        context.Add(principal);
                        break;

                    case EntityState.Unchanged:
                        context.Attach(principal);
                        break;

                    case EntityState.Modified:
                        context.Update(principal);
                        break;
                    }
                }

                Assert.Equal(2, context.ChangeTracker.Entries().Count());

                AssertFixup(
                    context,
                    () =>
                {
                    Assert.Equal(principal.Id, context.Entry(dependent).Property("ParentId").CurrentValue);
                    Assert.Same(dependent, principal.Child1);
                    Assert.Same(principal, dependent.Parent);
                    Assert.Equal(entityState, context.Entry(principal).State);
                    Assert.Equal(graph == null ? EntityState.Added : entityState, context.Entry(dependent).State);
                });
            }
        }
        private void Principal_nav_set_unidirectional_impl(EntityState entityState, bool?graph)
        {
            using (var context = new FixupContext())
            {
                var principal = new ParentPN {
                    Id = 77
                };
                if (graph == null)
                {
                    context.Entry(principal).State = entityState;
                }
                var dependent = new ChildPN {
                    Name = "1"
                };
                principal.Child1 = dependent;
                var subDependent = new SubChildPN {
                    Name = "1S"
                };
                dependent.SubChild = subDependent;

                if (graph == null)
                {
                    context.ChangeTracker.DetectChanges();
                }
                else if (graph == true)
                {
                    context.ChangeTracker.TrackGraph(principal, e => e.Entry.State = entityState);
                }
                else
                {
                    switch (entityState)
                    {
                    case EntityState.Added:
                        context.Add(principal);
                        break;

                    case EntityState.Unchanged:
                        context.Attach(principal);
                        break;

                    case EntityState.Modified:
                        context.Update(principal);
                        break;
                    }
                }

                Assert.Equal(3, context.ChangeTracker.Entries().Count());

                AssertFixup(
                    context,
                    () =>
                {
                    Assert.Equal(entityState, context.Entry(principal).State);

                    Assert.Same(dependent, principal.Child1);
                    Assert.Null(principal.Child2);
                    var dependentEntry = context.Entry(dependent);
                    Assert.Equal(principal.Id, dependentEntry.Property("ParentId").CurrentValue);
                    Assert.Equal(graph == null ? EntityState.Added : entityState, dependentEntry.State);
                    Assert.Equal(nameof(ParentPN.Child1), dependentEntry.Metadata.DefiningNavigationName);

                    Assert.Same(subDependent, dependent.SubChild);
                    var subDependentEntry = context.Entry(subDependent);
                    Assert.Equal(principal.Id, subDependentEntry.Property("ChildId").CurrentValue);
                    Assert.Equal(graph == null ? EntityState.Added : entityState, subDependentEntry.State);
                    Assert.Equal(nameof(ChildPN.SubChild), subDependentEntry.Metadata.DefiningNavigationName);
                });
            }
        }