public void Adding_duplicate_owned_entity_throws_by_default()
        {
            using (var context = new FixupContext(false))
            {
                var principal = new ParentPN {
                    Id = 77
                };
                var dependent = new ChildPN {
                    Name = "1"
                };
                principal.Child1 = dependent;
                principal.Child2 = dependent;

                var dependentEntry1 = context.Entry(principal).Reference(p => p.Child1).TargetEntry;

                Assert.Same(dependentEntry1.GetInfrastructure(), context.Entry(dependent).GetInfrastructure());

                Assert.Equal(
                    CoreStrings.WarningAsErrorTemplate(
                        CoreEventId.DuplicateDependentEntityTypeInstanceWarning.ToString(),
                        CoreStrings.LogDuplicateDependentEntityTypeInstance.GenerateMessage(
                            typeof(ParentPN).ShortDisplayName() + "." + nameof(ParentPN.Child2) + "#" + typeof(ChildPN).ShortDisplayName(),
                            typeof(ParentPN).ShortDisplayName() + "." + nameof(ParentPN.Child1) + "#" + typeof(ChildPN).ShortDisplayName()),
                        "CoreEventId.DuplicateDependentEntityTypeInstanceWarning"),
                    Assert.Throws <InvalidOperationException>(() => context.Entry(principal).Reference(p => p.Child2).TargetEntry).Message);
            }
        }
        public async Task Principal_nav_set_unidirectional_AddAsync()
        {
            using (var context = new FixupContext())
            {
                var principal = new ParentPN {
                    Id = 77
                };
                var dependent = new ChildPN {
                    Name = "1"
                };
                principal.Child1 = dependent;

                await context.AddAsync(principal);

                var entityState = EntityState.Added;

                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.Equal(entityState, context.Entry(principal).State);
                    Assert.Equal(entityState, context.Entry(dependent).State);
                });
            }
        }
        public void Identity_changed_unidirectional(EntityState entityState)
        {
            using (var context = new FixupContext())
            {
                var principal = new ParentPN {
                    Id = 77
                };
                var dependent = new ChildPN {
                    Name = "1"
                };
                principal.Child1 = dependent;

                context.ChangeTracker.TrackGraph(principal, e => e.Entry.State = entityState);

                var dependentEntry1 = context.Entry(principal).Reference(p => p.Child1).TargetEntry;

                principal.Child1 = null;
                principal.Child2 = dependent;

                context.ChangeTracker.DetectChanges();

                Assert.Equal(entityState == EntityState.Added ? 2 : 3, context.ChangeTracker.Entries().Count());
                Assert.Null(principal.Child1);
                Assert.Same(dependent, principal.Child2);
                Assert.Equal(entityState, context.Entry(principal).State);
                Assert.Equal(entityState == EntityState.Added ? EntityState.Detached : EntityState.Deleted, dependentEntry1.State);
                var dependentEntry2 = context.Entry(principal).Reference(p => p.Child2).TargetEntry;
                Assert.Equal(principal.Id, dependentEntry2.Property("ParentId").CurrentValue);
                Assert.Equal(EntityState.Added, dependentEntry2.State);
                Assert.Equal(nameof(ParentPN.Child2), dependentEntry2.Metadata.DefiningNavigationName);
            }
        }
        public void Replacing_owned_entity_throws_sensitive(EntityState entityState)
        {
            using (var context = new SensitiveFixupContext())
            {
                var principal = new ParentPN {
                    Id = 77
                };
                var dependent1 = new ChildPN {
                    Name = "1"
                };
                principal.Child1 = dependent1;
                var dependent2 = new ChildPN {
                    Name = "2"
                };

                context.ChangeTracker.TrackGraph(principal, e => e.Entry.State = entityState);

                principal.Child1 = dependent2;

                Assert.Equal(
                    CoreStrings.IdentityConflictOwnedSensitive("ParentPN.Child1#ChildPN", "ParentId:77"),
                    Assert.Throws <InvalidOperationException>(
                        () => context.ChangeTracker.DetectChanges()).Message);
            }
        }
        public void Can_get_owned_entity_entry()
        {
            using (var context = new FixupContext())
            {
                var principal = new ParentPN {
                    Id = 77
                };
                var dependent = new ChildPN {
                    Name = "1"
                };
                principal.Child1 = dependent;
                principal.Child2 = dependent;

                Assert.Equal(
                    CoreStrings.UntrackedDependentEntity(
                        typeof(ChildPN).ShortDisplayName(),
                        "." + nameof(EntityEntry.Reference) + "()." + nameof(ReferenceEntry.TargetEntry)),
                    Assert.Throws <InvalidOperationException>(() => context.Entry(dependent)).Message);

                var dependentEntry1 = context.Entry(principal).Reference(p => p.Child1).TargetEntry;

                Assert.Same(dependentEntry1.GetInfrastructure(), context.Entry(dependent).GetInfrastructure());

                var dependentEntry2 = context.Entry(principal).Reference(p => p.Child2).TargetEntry;

                Assert.NotNull(dependentEntry2);
                Assert.Equal(
                    CoreStrings.AmbiguousDependentEntity(
                        typeof(ChildPN).ShortDisplayName(),
                        "." + nameof(EntityEntry.Reference) + "()." + nameof(ReferenceEntry.TargetEntry)),
                    Assert.Throws <InvalidOperationException>(() => context.Entry(dependent)).Message);
            }
        }
        public void Parent_and_identity_swapped_unidirectional(EntityState entityState)
        {
            using (var context = new FixupContext())
            {
                var principal1 = new ParentPN {
                    Id = 77
                };
                var principal2 = new ParentPN {
                    Id = 78
                };
                var dependent1 = new ChildPN {
                    Name = "1"
                };
                principal1.Child2 = dependent1;
                var dependent2 = new ChildPN {
                    Name = "2"
                };
                principal2.Child1 = dependent2;

                context.ChangeTracker.TrackGraph(principal1, e => e.Entry.State = entityState);
                context.ChangeTracker.TrackGraph(principal2, e => e.Entry.State = entityState);

                principal2.Child1 = dependent1;
                principal1.Child2 = dependent2;

                context.ChangeTracker.DetectChanges();

                Assert.Equal(4, context.ChangeTracker.Entries().Count());
                Assert.Null(principal1.Child1);
                Assert.Same(dependent2, principal1.Child2);
                Assert.Same(dependent1, principal2.Child1);
                Assert.Null(principal2.Child2);
                Assert.Equal(entityState, context.Entry(principal1).State);
                Assert.Equal(entityState, context.Entry(principal2).State);

                var dependent1Entry = context.Entry(principal1).Reference(p => p.Child2).TargetEntry;
                Assert.Equal(EntityState.Added, dependent1Entry.State);
                Assert.Equal(principal1.Id, dependent1Entry.Property("ParentId").CurrentValue);
                Assert.Equal(nameof(Parent.Child2), dependent1Entry.Metadata.DefiningNavigationName);
                Assert.Equal(entityState == EntityState.Added ? null : (EntityState?)EntityState.Deleted,
                             dependent1Entry.GetInfrastructure().SharedIdentityEntry?.EntityState);

                var dependent2Entry = context.Entry(principal2).Reference(p => p.Child1).TargetEntry;
                Assert.Equal(principal2.Id, dependent2Entry.Property("ParentId").CurrentValue);
                Assert.Equal(EntityState.Added, dependent2Entry.State);
                Assert.Equal(nameof(Parent.Child1), dependent2Entry.Metadata.DefiningNavigationName);
                Assert.Equal(entityState == EntityState.Added ? null : (EntityState?)EntityState.Deleted,
                             dependent2Entry.GetInfrastructure().SharedIdentityEntry?.EntityState);

                dependent1Entry.GetInfrastructure().AcceptChanges();
                dependent2Entry.GetInfrastructure().AcceptChanges();
                Assert.Null(dependent1Entry.GetInfrastructure().SharedIdentityEntry);
                Assert.Null(dependent2Entry.GetInfrastructure().SharedIdentityEntry);
            }
        }
        public void Parent_swapped_unidirectional(EntityState entityState)
        {
            using (var context = new FixupContext())
            {
                var principal1 = new ParentPN {
                    Id = 77
                };
                var principal2 = new ParentPN {
                    Id = 78
                };
                var dependent1 = new ChildPN {
                    Name = "1"
                };
                principal1.Child1 = dependent1;
                var dependent2 = new ChildPN {
                    Name = "2"
                };
                principal2.Child1 = dependent2;

                context.ChangeTracker.TrackGraph(principal1, e => e.Entry.State = entityState);
                context.ChangeTracker.TrackGraph(principal2, e => e.Entry.State = entityState);

                principal1.Child1 = dependent2;
                principal2.Child1 = dependent1;

                if (entityState != EntityState.Added)
                {
                    Assert.Equal(
                        CoreStrings.KeyReadOnly("ParentId",
                                                context.Entry(principal1).Reference(p => p.Child1).Metadata.GetTargetType().DisplayName()),
                        Assert.Throws <InvalidOperationException>(() => context.ChangeTracker.DetectChanges()).Message);
                }
                else
                {
                    context.ChangeTracker.DetectChanges();

                    Assert.Equal(4, context.ChangeTracker.Entries().Count());
                    Assert.Same(dependent2, principal1.Child1);
                    Assert.Null(principal1.Child2);
                    Assert.Same(dependent1, principal2.Child1);
                    Assert.Null(principal2.Child2);
                    Assert.Equal(entityState, context.Entry(principal1).State);
                    Assert.Equal(entityState, context.Entry(principal2).State);
                    var dependent1Entry = context.Entry(principal1).Reference(p => p.Child1).TargetEntry;
                    Assert.Equal(principal1.Id, dependent1Entry.Property("ParentId").CurrentValue);
                    Assert.Equal(entityState == EntityState.Added ? EntityState.Added : EntityState.Modified, dependent1Entry.State);
                    Assert.Equal(nameof(Parent.Child1), dependent1Entry.Metadata.DefiningNavigationName);
                    var dependent2Entry = context.Entry(principal2).Reference(p => p.Child1).TargetEntry;
                    Assert.Equal(principal2.Id, dependent2Entry.Property("ParentId").CurrentValue);
                    Assert.Equal(entityState == EntityState.Added ? EntityState.Added : EntityState.Modified, dependent2Entry.State);
                    Assert.Equal(nameof(Parent.Child1), dependent2Entry.Metadata.DefiningNavigationName);
                }
            }
        }
        public void Identity_swapped_unidirectional(EntityState entityState)
        {
            using (var context = new FixupContext())
            {
                var principal = new ParentPN {
                    Id = 77
                };
                var dependent1 = new ChildPN {
                    Name = "1"
                };
                principal.Child1 = dependent1;
                var dependent2 = new ChildPN {
                    Name = "2"
                };
                principal.Child2 = dependent2;

                context.ChangeTracker.TrackGraph(principal, e => e.Entry.State = entityState);

                var dependent1Entry = context.Entry(principal).Reference(p => p.Child1).TargetEntry;
                var dependent2Entry = context.Entry(principal).Reference(p => p.Child2).TargetEntry;

                principal.Child2 = dependent1;
                principal.Child1 = dependent2;

                context.ChangeTracker.DetectChanges();

                Assert.Equal(3, context.ChangeTracker.Entries().Count());
                Assert.Same(dependent1, principal.Child2);
                Assert.Same(dependent2, principal.Child1);
                Assert.Equal(entityState, context.Entry(principal).State);
                Assert.Same(
                    dependent1Entry.GetInfrastructure(),
                    context.Entry(principal).Reference(p => p.Child1).TargetEntry.GetInfrastructure());
                Assert.Equal(principal.Id, dependent1Entry.Property("ParentId").CurrentValue);
                Assert.Equal(EntityState.Modified, dependent1Entry.State);
                Assert.Equal(nameof(Parent.Child1), dependent1Entry.Metadata.DefiningNavigationName);
                Assert.Same(
                    dependent2Entry.GetInfrastructure(),
                    context.Entry(principal).Reference(p => p.Child2).TargetEntry.GetInfrastructure());
                Assert.Equal(principal.Id, dependent2Entry.Property("ParentId").CurrentValue);
                Assert.Equal(EntityState.Modified, dependent2Entry.State);
                Assert.Equal(nameof(Parent.Child2), dependent2Entry.Metadata.DefiningNavigationName);
            }
        }
        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);
                });
            }
        }
Exemple #10
0
        public void Add_dependent_then_principal_one_to_one_prin_uni_FK_set_principal_nav_set(EntityState entityState)
        {
            using (var context = new FixupContext())
            {
                var principal = new ParentPN { Id = 77 };
                var dependent = new ChildPN { Id = 78, ParentId = principal.Id };
                principal.Child = dependent;

                context.Entry(dependent).State = entityState;
                context.Entry(principal).State = entityState;

                Assert.Equal(principal.Id, dependent.ParentId);
                Assert.Same(dependent, principal.Child);
                Assert.Equal(entityState, context.Entry(principal).State);
                Assert.Equal(entityState, context.Entry(dependent).State);
            }
        }
        public void Add_principal_then_dependent_one_to_one_prin_uni_FK_not_set_principal_nav_set(EntityState entityState)
        {
            using (var context = new FixupContext())
            {
                var principal = new ParentPN { Id = 77 };
                var dependent = new ChildPN { Id = 78 };
                principal.Child = dependent;

                context.Entry(principal).State = entityState;
                context.Entry(dependent).State = entityState;

                AssertFixup(
                    context,
                    () =>
                        {
                            Assert.Equal(principal.Id, context.Entry(dependent).Property("ParentId").CurrentValue);
                            Assert.Same(dependent, principal.Child);
                            Assert.Equal(entityState, context.Entry(principal).State);
                            Assert.Equal(entityState, context.Entry(dependent).State);
                        });
            }
        }
Exemple #12
0
        public void Add_principal_but_not_dependent_one_to_one_prin_uni_FK_not_set_principal_nav_set(EntityState entityState)
        {
            using (var context = new FixupContext())
            {
                var principal = new ParentPN { Id = 77 };
                var dependent = new ChildPN { Id = 78 };

                context.Entry(principal).State = entityState;

                principal.Child = dependent;

                context.ChangeTracker.DetectChanges();

                AssertFixup(
                    context,
                    () =>
                        {
                            Assert.Equal(principal.Id, dependent.ParentId);
                            Assert.Same(dependent, principal.Child);
                            Assert.Equal(entityState, context.Entry(principal).State);
                            Assert.Equal(EntityState.Added, context.Entry(dependent).State);
                        });
            }
        }
Exemple #13
0
        public void Add_dependent_but_not_principal_one_to_one_prin_uni_FK_set_no_navs_set(EntityState entityState)
        {
            using (var context = new FixupContext())
            {
                var principal = new ParentPN { Id = 77 };
                var dependent = new ChildPN { Id = 78 };

                context.Entry(dependent).State = entityState;

                dependent.ParentId = principal.Id;

                context.ChangeTracker.DetectChanges();

                AssertFixup(
                    context,
                    () =>
                        {
                            Assert.Equal(principal.Id, dependent.ParentId);
                            Assert.Null(principal.Child);
                            Assert.Equal(EntityState.Detached, context.Entry(principal).State);
                            Assert.Equal(entityState == EntityState.Added ? EntityState.Added : EntityState.Modified, context.Entry(dependent).State);
                        });
            }
        }