public void Query_subowned()
        {
            Seed();

            using var context = new QueryFixupContext();
            var subDependent1 = context.Set <Order>()
                                .Select(o => o.OrderDetails.BillingAddress)
                                .Include(a => a.OrderDetails.Order).Single();
            var subDependent2 = context.Set <Order>()
                                .Select(o => o.OrderDetails.ShippingAddress)
                                .Include(a => a.OrderDetails.Order).Single();

            AssertFixup(
                context,
                () =>
            {
                Assert.Equal("BillMe", subDependent1.Street);
                Assert.Equal("ShipMe", subDependent2.Street);

                var dependent = subDependent1.OrderDetails;
                Assert.Same(dependent, subDependent2.OrderDetails);
                Assert.NotNull(dependent.Order);
                var principal = dependent.Order;

                var subDependent1Entry = context.Entry(subDependent1);
                Assert.Equal(principal.Id, subDependent1Entry.Property("OrderDetailsId").CurrentValue);
                Assert.Equal(nameof(OrderDetails.BillingAddress), subDependent1Entry.Metadata.DefiningNavigationName);

                var subDependent2Entry = context.Entry(subDependent2);
                Assert.Equal(principal.Id, subDependent2Entry.Property("OrderDetailsId").CurrentValue);
                Assert.Equal(nameof(OrderDetails.ShippingAddress), subDependent2Entry.Metadata.DefiningNavigationName);
            });
        }
        public void Query_self_ref_dependent_nav_only_with_existing(EntityState existingState)
        {
            Seed();

            using var context = new QueryFixupContext();
            var newDependent = new WidgetDN {
                ParentWidgetId = 77
            };

            context.Entry(newDependent).State = existingState;

            var widgets   = context.Set <WidgetDN>().ToList();
            var dependent = widgets.Single(e => e.Id == 78);
            var principal = widgets.Single(e => e.Id == 77);

            AssertFixup(
                context,
                () =>
            {
                Assert.Equal(principal.Id, dependent.ParentWidgetId);
                Assert.Same(principal, dependent.ParentWidget);

                Assert.Equal(principal.Id, newDependent.ParentWidgetId);
                Assert.Same(principal, newDependent.ParentWidget);
            });
        }
        public void Query_principal_include_dependent_self_ref_unidirectional_with_existing(EntityState existingState)
        {
            Seed();

            using var context = new QueryFixupContext();
            var newDependent = new WidgetPN {
                ParentWidgetId = 77
            };

            context.Entry(newDependent).State = existingState;

            var widgets   = context.Set <WidgetPN>().Include(e => e.ChildWidgets).ToList();
            var dependent = widgets.Single(e => e.Id == 78);
            var principal = widgets.Single(e => e.Id == 77);

            AssertFixup(
                context,
                () =>
            {
                Assert.Equal(principal.Id, dependent.ParentWidgetId);
                Assert.Contains(dependent, principal.ChildWidgets);

                Assert.Equal(principal.Id, newDependent.ParentWidgetId);
                Assert.Contains(newDependent, principal.ChildWidgets);
            });
        }
        public void Query_principal_include_dependent_unidirectional_with_existing(EntityState existingState)
        {
            Seed();

            using var context = new QueryFixupContext();
            var newDependent = new ProductPN {
                CategoryId = 77
            };

            context.Entry(newDependent).State = existingState;

            var principal = context.Set <CategoryPN>().Include(e => e.Products).Single();
            var dependent = principal.Products.Single(e => e.Id != newDependent.Id);

            AssertFixup(
                context,
                () =>
            {
                Assert.Equal(principal.Id, dependent.CategoryId);
                Assert.Contains(dependent, principal.Products);

                Assert.Equal(principal.Id, newDependent.CategoryId);
                Assert.Contains(newDependent, principal.Products);
            });
        }
        public void Query_dependent_include_principal_unidirectional_with_existing(EntityState existingState)
        {
            Seed();

            using var context = new QueryFixupContext();
            var newDependent = new ProductDN {
                CategoryId = 77
            };

            context.Entry(newDependent).State = existingState;

            var dependent = context.Set <ProductDN>().Include(e => e.Category).Single();
            var principal = dependent.Category;

            AssertFixup(
                context,
                () =>
            {
                Assert.Equal(principal.Id, dependent.CategoryId);
                Assert.Same(principal, dependent.Category);

                Assert.Equal(principal.Id, newDependent.CategoryId);
                Assert.Same(principal, newDependent.Category);
            });
        }
示例#6
0
    public void Query_ownership_navigations()
    {
        Seed();

        using var context = new QueryFixupContext();
        var principal = context.Set <Order>()
                        .Single();

        AssertFixup(
            context,
            () =>
        {
            var dependent = principal.OrderDetails;
            Assert.Same(principal, dependent.Order);

            var subDependent1 = dependent.BillingAddress;
            var subDependent2 = dependent.ShippingAddress;
            Assert.Same(dependent, subDependent1.OrderDetails);
            Assert.Same(dependent, subDependent2.OrderDetails);
            Assert.Equal("BillMe", subDependent1.Street);
            Assert.Equal("ShipMe", subDependent2.Street);

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

            var principalEntry = context.Entry(principal);
            Assert.Equal(EntityState.Unchanged, principalEntry.State);

            var dependentEntry = principalEntry.Reference(p => p.OrderDetails).TargetEntry;
            Assert.Equal(principal.Id, dependentEntry.Property("OrderId").CurrentValue);
            Assert.Equal(EntityState.Unchanged, dependentEntry.State);
            Assert.Equal(nameof(OrderDetails), dependentEntry.Metadata.FindOwnership().PrincipalToDependent.Name);

            var subDependent1Entry = dependentEntry.Reference(p => p.BillingAddress).TargetEntry;
            Assert.Equal(principal.Id, subDependent1Entry.Property("OrderDetailsId").CurrentValue);
            Assert.Equal(EntityState.Unchanged, subDependent1Entry.State);
            Assert.Equal(
                typeof(OrderDetails).DisplayName()
                + "."
                + nameof(OrderDetails.BillingAddress)
                + "#"
                + typeof(Address).ShortDisplayName(), subDependent1Entry.Metadata.Name);

            var subDependent2Entry = dependentEntry.Reference(p => p.ShippingAddress).TargetEntry;
            Assert.Equal(principal.Id, subDependent2Entry.Property("OrderDetailsId").CurrentValue);
            Assert.Equal(EntityState.Unchanged, subDependent2Entry.State);
            Assert.Equal(
                typeof(OrderDetails).DisplayName()
                + "."
                + nameof(OrderDetails.ShippingAddress)
                + "#"
                + typeof(Address).ShortDisplayName(), subDependent2Entry.Metadata.Name);
        });
    }
        public void Query_ownership_navigations()
        {
            Seed();

            using (var context = new QueryFixupContext())
            {
                // TODO: Infer these includes
                // Issue #2953
                var principal = context.Set <Order>()
                                .Include(o => o.OrderDetails.BillingAddress)
                                .Include(o => o.OrderDetails.ShippingAddress)
                                .Single();

                AssertFixup(
                    context,
                    () =>
                {
                    var dependent = principal.OrderDetails;
                    Assert.Same(principal, dependent.Order);

                    var subDependent1 = dependent.BillingAddress;
                    var subDependent2 = dependent.ShippingAddress;
                    Assert.Same(dependent, subDependent1.OrderDetails);
                    Assert.Same(dependent, subDependent2.OrderDetails);
                    Assert.Equal("BillMe", subDependent1.Street);
                    Assert.Equal("ShipMe", subDependent2.Street);

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

                    var principalEntry = context.Entry(principal);
                    Assert.Equal(EntityState.Unchanged, principalEntry.State);

                    var dependentEntry = principalEntry.Reference(p => p.OrderDetails).TargetEntry;
                    Assert.Equal(principal.Id, dependentEntry.Property("OrderId").CurrentValue);
                    Assert.Equal(EntityState.Unchanged, dependentEntry.State);
                    Assert.Equal(nameof(Order.OrderDetails), dependentEntry.Metadata.DefiningNavigationName);

                    var subDependent1Entry = dependentEntry.Reference(p => p.BillingAddress).TargetEntry;
                    Assert.Equal(principal.Id, subDependent1Entry.Property("OrderDetailsId").CurrentValue);
                    Assert.Equal(EntityState.Unchanged, subDependent1Entry.State);
                    Assert.Equal(nameof(OrderDetails.BillingAddress), subDependent1Entry.Metadata.DefiningNavigationName);

                    var subDependent2Entry = dependentEntry.Reference(p => p.ShippingAddress).TargetEntry;
                    Assert.Equal(principal.Id, subDependent2Entry.Property("OrderDetailsId").CurrentValue);
                    Assert.Equal(EntityState.Unchanged, subDependent2Entry.State);
                    Assert.Equal(nameof(OrderDetails.ShippingAddress), subDependent2Entry.Metadata.DefiningNavigationName);
                });
            }
        }
        public void Query_owned()
        {
            Seed();

            using var context = new QueryFixupContext();
            var owned     = context.Set <Order>().Single().OrderDetails;
            var principal = context.Set <Order>().AsNoTracking().Single();

            AssertFixup(
                context,
                () =>
            {
                var dependentEntry = context.Entry(owned);
                Assert.Equal(principal.Id, dependentEntry.Property("OrderId").CurrentValue);
                Assert.Equal(nameof(Order.OrderDetails), dependentEntry.Metadata.FindOwnership().PrincipalToDependent.Name);
            });
        }
        public void Query_owned()
        {
            Seed();

            using (var context = new QueryFixupContext())
            {
                var owned     = context.Set <Order>().Select(o => o.OrderDetails).Single();
                var principal = context.Set <Order>().AsNoTracking().Single();

                AssertFixup(
                    context,
                    () =>
                {
                    var dependentEntry = context.Entry(owned);
                    Assert.Equal(principal.Id, dependentEntry.Property("OrderId").CurrentValue);
                    Assert.Equal(nameof(Order.OrderDetails), dependentEntry.Metadata.DefiningNavigationName);
                });
            }
        }