public void Cannot_ignore_same_or_higher_source_entity_type_using_entity_type_name()
        {
            var model        = new Model();
            var modelBuilder = new InternalModelBuilder(model, null);

            Assert.True(modelBuilder.Ignore(typeof(Customer).FullName, ConfigurationSource.Convention));
            Assert.NotNull(modelBuilder.Entity(typeof(Customer).FullName, ConfigurationSource.Convention));
            Assert.NotNull(modelBuilder.Entity(typeof(Customer).FullName, ConfigurationSource.DataAnnotation));

            Assert.False(modelBuilder.Ignore(typeof(Customer).FullName, ConfigurationSource.Convention));

            Assert.NotNull(model.TryGetEntityType(typeof(Customer).FullName));
        }
        public void Can_ignore_lower_source_entity_type_using_entity_clr_type()
        {
            var model        = new Model();
            var modelBuilder = new InternalModelBuilder(model, null);

            modelBuilder.Entity(typeof(Customer), ConfigurationSource.Convention);

            Assert.True(modelBuilder.Ignore(typeof(Customer), ConfigurationSource.DataAnnotation));

            Assert.Null(model.TryGetEntityType(typeof(Customer)));
            Assert.True(modelBuilder.Ignore(typeof(Customer), ConfigurationSource.DataAnnotation));
            Assert.Null(modelBuilder.Entity(typeof(Customer), ConfigurationSource.Convention));
            Assert.NotNull(modelBuilder.Entity(typeof(Customer), ConfigurationSource.DataAnnotation));
        }
        public void Can_ignore_lower_source_entity_type_using_entity_type_name()
        {
            var model        = new Model();
            var modelBuilder = new InternalModelBuilder(model, null);

            modelBuilder.Entity(typeof(Customer).FullName, ConfigurationSource.DataAnnotation);

            Assert.True(modelBuilder.Ignore(typeof(Customer).FullName, ConfigurationSource.Explicit));

            Assert.Null(model.TryGetEntityType(typeof(Customer).FullName));
            Assert.True(modelBuilder.Ignore(typeof(Customer).FullName, ConfigurationSource.Explicit));
            Assert.Null(modelBuilder.Entity(typeof(Customer).FullName, ConfigurationSource.DataAnnotation));

            Assert.Equal(Strings.EntityIgnoredExplicitly(typeof(Customer).FullName),
                         Assert.Throws <InvalidOperationException>(() =>
                                                                   Assert.Null(modelBuilder.Entity(typeof(Customer).FullName, ConfigurationSource.Explicit))).Message);
        }
        public void Cannot_ignore_existing_entity_type_using_entity_type_name()
        {
            var model        = new Model();
            var entityType   = model.AddEntityType(typeof(Customer).FullName);
            var modelBuilder = new InternalModelBuilder(model, null);

            Assert.Same(entityType, modelBuilder.Entity(typeof(Customer).FullName, ConfigurationSource.Convention).Metadata);

            Assert.False(modelBuilder.Ignore(typeof(Customer).FullName, ConfigurationSource.DataAnnotation));

            Assert.Same(entityType, modelBuilder.Entity(typeof(Customer).FullName, ConfigurationSource.Convention).Metadata);
            Assert.False(modelBuilder.Ignore(typeof(Customer).FullName, ConfigurationSource.DataAnnotation));
            Assert.NotNull(model.TryGetEntityType(typeof(Customer).FullName));

            Assert.Equal(Strings.EntityAddedExplicitly(typeof(Customer).FullName),
                         Assert.Throws <InvalidOperationException>(() =>
                                                                   Assert.False(modelBuilder.Ignore(typeof(Customer).FullName, ConfigurationSource.Explicit))).Message);
        }
        public void ForeignKey_returns_null_for_property_names_if_entity_type_ignored()
        {
            var modelBuilder = new InternalModelBuilder(new Model(), null);

            modelBuilder.Ignore(typeof(Customer), ConfigurationSource.Explicit);
            var entityBuilder = modelBuilder.Entity(typeof(Order), ConfigurationSource.Explicit);

            var foreignKeyBuilder = entityBuilder.ForeignKey(typeof(Customer).FullName, new[] { Order.CustomerIdProperty.Name, Order.CustomerUniqueProperty.Name }, ConfigurationSource.Convention);

            Assert.Null(foreignKeyBuilder);
        }
        public void BuildRelationship_returns_null_for_clr_types_if_principal_entity_type_ignored()
        {
            var modelBuilder = new InternalModelBuilder(new Model(), null);

            modelBuilder.Ignore(typeof(Customer), ConfigurationSource.Explicit);
            var orderEntityBuilder = modelBuilder.Entity(typeof(Order), ConfigurationSource.Explicit);

            var relationshipBuilder = orderEntityBuilder.BuildRelationship(typeof(Customer), typeof(Order), null, null, /*oneToOne:*/ true, ConfigurationSource.Convention);

            Assert.Null(relationshipBuilder);
        }
        public void BuildRelationship_returns_null_for_clr_types_if_dependent_entity_type_ignored()
        {
            var modelBuilder          = new InternalModelBuilder(new Model(), null);
            var customerEntityBuilder = modelBuilder.Entity(typeof(Customer), ConfigurationSource.Explicit);

            customerEntityBuilder.Key(new[] { Customer.IdProperty, Customer.UniqueProperty }, ConfigurationSource.Explicit);
            modelBuilder.Ignore(typeof(Order), ConfigurationSource.Explicit);

            var relationshipBuilder = customerEntityBuilder.BuildRelationship(typeof(Customer), typeof(Order), null, null, /*oneToOne:*/ true, ConfigurationSource.Convention);

            Assert.Null(relationshipBuilder);
        }
        public void Cannot_ignore_entity_type_referenced_from_same_or_higher_source_foreign_key()
        {
            var modelBuilder = new InternalModelBuilder(new Model(), null);

            modelBuilder
            .Entity(typeof(Customer), ConfigurationSource.Convention)
            .Key(new[] { Customer.IdProperty }, ConfigurationSource.Convention);
            var orderEntityTypeBuilder = modelBuilder.Entity(typeof(Order), ConfigurationSource.Convention);

            Assert.NotNull(orderEntityTypeBuilder.ForeignKey(typeof(Customer), new[] { Order.CustomerIdProperty }, ConfigurationSource.Explicit));

            Assert.False(modelBuilder.Ignore(typeof(Customer), ConfigurationSource.DataAnnotation));

            Assert.Equal(2, modelBuilder.Metadata.EntityTypes.Count);
            Assert.Equal(1, orderEntityTypeBuilder.Metadata.ForeignKeys.Count);
        }
        public void Can_ignore_entity_type_referenced_from_lower_source_foreign_key()
        {
            var modelBuilder = new InternalModelBuilder(new Model(), null);

            modelBuilder
            .Entity(typeof(Customer), ConfigurationSource.Convention)
            .Key(new[] { Customer.IdProperty }, ConfigurationSource.Convention);
            var orderEntityTypeBuilder = modelBuilder.Entity(typeof(Order), ConfigurationSource.Explicit);

            Assert.NotNull(orderEntityTypeBuilder.ForeignKey(typeof(Customer), new[] { Order.CustomerIdProperty }, ConfigurationSource.Convention));

            Assert.True(modelBuilder.Ignore(typeof(Customer), ConfigurationSource.Explicit));

            Assert.Equal(typeof(Order), modelBuilder.Metadata.EntityTypes.Single().Type);
            Assert.Empty(orderEntityTypeBuilder.Metadata.ForeignKeys);
        }
        public void Ignoring_an_entity_type_removes_lower_source_orphaned_entity_types()
        {
            var modelBuilder = new InternalModelBuilder(new Model(), null);

            modelBuilder
            .Entity(typeof(Customer), ConfigurationSource.Convention)
            .Key(new[] { Customer.IdProperty }, ConfigurationSource.Convention);
            modelBuilder
            .Entity(typeof(Product), ConfigurationSource.Convention)
            .Key(new[] { Product.IdProperty }, ConfigurationSource.Convention);

            var orderEntityTypeBuilder = modelBuilder.Entity(typeof(Order), ConfigurationSource.Convention);

            orderEntityTypeBuilder.ForeignKey(typeof(Customer), new[] { Order.CustomerIdProperty }, ConfigurationSource.Convention);
            orderEntityTypeBuilder.ForeignKey(typeof(Product), new[] { Order.ProductIdProperty }, ConfigurationSource.Convention);

            Assert.True(modelBuilder.Ignore(typeof(Customer), ConfigurationSource.Explicit));

            Assert.Empty(modelBuilder.Metadata.EntityTypes);
        }
        public void Ignoring_an_entity_type_does_not_remove_referencing_lower_source_entity_types()
        {
            var modelBuilder = new InternalModelBuilder(new Model(), null);

            modelBuilder
            .Entity(typeof(Customer), ConfigurationSource.Convention)
            .Key(new[] { Customer.IdProperty }, ConfigurationSource.Convention);
            modelBuilder
            .Entity(typeof(Product), ConfigurationSource.Explicit)
            .Key(new[] { Product.IdProperty }, ConfigurationSource.Convention);

            var orderEntityTypeBuilder = modelBuilder.Entity(typeof(Order), ConfigurationSource.Convention);

            orderEntityTypeBuilder.ForeignKey(typeof(Customer), new[] { Order.CustomerIdProperty }, ConfigurationSource.Convention);
            orderEntityTypeBuilder.ForeignKey(typeof(Product), new[] { Order.ProductIdProperty }, ConfigurationSource.Convention);

            Assert.True(modelBuilder.Ignore(typeof(Customer), ConfigurationSource.DataAnnotation));

            Assert.Equal(new[] { typeof(Order), typeof(Product) }, modelBuilder.Metadata.EntityTypes.Select(et => et.Type));
            Assert.Equal(typeof(Product), orderEntityTypeBuilder.Metadata.ForeignKeys.Single().ReferencedEntityType.Type);
        }