/// <summary>
        ///     Adds an <see cref="EntityTypeConfiguration" /> to the <see cref="DbModelBuilder" />.
        ///     Only one <see cref="EntityTypeConfiguration" /> can be added for each type in a model.
        /// </summary>
        /// <typeparam name="TEntityType"> The entity type being configured. </typeparam>
        /// <param name="entityTypeConfiguration"> The entity type configuration to be added. </param>
        /// <returns> The same ConfigurationRegistrar instance so that multiple calls can be chained. </returns>
        public virtual ConfigurationRegistrar Add <TEntityType>(
            EntityTypeConfiguration <TEntityType> entityTypeConfiguration)
            where TEntityType : class
        {
            Check.NotNull(entityTypeConfiguration, "entityTypeConfiguration");
            Debug.Assert(entityTypeConfiguration.Configuration != null);

            _modelConfiguration.Add((EntityTypeConfiguration)entityTypeConfiguration.Configuration);

            return(this);
        }
        public virtual void AddConfigurationTypesToModel(IEnumerable<Type> types, ModelConfiguration modelConfiguration)
        {
            DebugCheck.NotNull(types);
            DebugCheck.NotNull(modelConfiguration);

            foreach (var type in types)
            {
                if (_filter.IsEntityTypeConfiguration(type))
                {
                    modelConfiguration.Add(_activator.Activate<EntityTypeConfiguration>(type));
                }
                else if (_filter.IsComplexTypeConfiguration(type))
                {
                    modelConfiguration.Add(_activator.Activate<ComplexTypeConfiguration>(type));
                }
            }
        }
        public virtual void AddConfigurationTypesToModel(IEnumerable <Type> types, ModelConfiguration modelConfiguration)
        {
            DebugCheck.NotNull(types);
            DebugCheck.NotNull(modelConfiguration);

            foreach (var type in types)
            {
                if (_filter.IsEntityTypeConfiguration(type))
                {
                    modelConfiguration.Add(_activator.Activate <EntityTypeConfiguration>(type));
                }
                else if (_filter.IsComplexTypeConfiguration(type))
                {
                    modelConfiguration.Add(_activator.Activate <ComplexTypeConfiguration>(type));
                }
            }
        }
        public void IsComplexType_should_return_true_when_type_is_complex()
        {
            var modelConfiguration = new ModelConfiguration();
            modelConfiguration.Add(new Mock<ComplexTypeConfiguration>(typeof(object)).Object);

            Assert.True(modelConfiguration.IsComplexType(typeof(object)));
        }
        public void GetStructuralTypeConfiguration_should_return_registered_complex_type_configuration()
        {
            var modelConfiguration = new ModelConfiguration();
            var complexTypeConfiguration = new Mock<ComplexTypeConfiguration>(typeof(object)).Object;
            modelConfiguration.Add(complexTypeConfiguration);

            Assert.Same(complexTypeConfiguration, modelConfiguration.GetStructuralTypeConfiguration(typeof(object)));
        }
        public void GetStructuralTypeConfiguration_should_return_registered_entity_configuration()
        {
            var modelConfiguration = new ModelConfiguration();
            var entityTypeConfiguration = new Mock<EntityTypeConfiguration>(typeof(object)).Object;
            modelConfiguration.Add(entityTypeConfiguration);

            Assert.Same(entityTypeConfiguration, modelConfiguration.GetStructuralTypeConfiguration(typeof(object)));
        }
        public void ComplexType_should_throw_when_configuration_is_not_for_complex_type()
        {
            var modelConfiguration = new ModelConfiguration();
            modelConfiguration.Add(new Mock<EntityTypeConfiguration>(typeof(object)).Object);

            Assert.Equal(
                Strings.ComplexTypeConfigurationMismatch(typeof(object).Name),
                Assert.Throws<InvalidOperationException>(() => modelConfiguration.ComplexType(typeof(object))).Message);
        }
        public void Can_add_and_get_complex_type_configuration()
        {
            var modelConfiguration = new ModelConfiguration();
            var complexTypeConfiguration = new Mock<ComplexTypeConfiguration>(typeof(object)).Object;
            modelConfiguration.Add(complexTypeConfiguration);

            Assert.Same(complexTypeConfiguration, modelConfiguration.ComplexType(typeof(object)));
        }
        public void Can_add_and_get_entity_configuration()
        {
            var modelConfiguration = new ModelConfiguration();
            var entityTypeConfiguration = new Mock<EntityTypeConfiguration>(typeof(object)).Object;
            modelConfiguration.Add(entityTypeConfiguration);

            Assert.Same(entityTypeConfiguration, modelConfiguration.Entity(typeof(object)));
        }
        public void Adding_complex_type_and_entity_configurations_should_throw()
        {
            var modelConfiguration = new ModelConfiguration();
            var complexTypeConfiguration = new Mock<ComplexTypeConfiguration>(typeof(object)).Object;
            var entityTypeConfiguration = new Mock<EntityTypeConfiguration>(typeof(object)).Object;
            modelConfiguration.Add(complexTypeConfiguration);

            Assert.Equal(
                Strings.DuplicateStructuralTypeConfiguration(typeof(object)),
                Assert.Throws<InvalidOperationException>(() => modelConfiguration.Add(entityTypeConfiguration)).Message);
        }
        public void Configure_should_configure_active_entities_and_complex_types()
        {
            var mockEntityType = new MockType();
            var mockComplexType = new MockType();

            var model = new EdmModel(DataSpace.CSpace);
            var entityType = model.AddEntityType("E");

            entityType.GetMetadataProperties().SetClrType(mockEntityType);
            var complexType = model.AddComplexType("C");

            complexType.GetMetadataProperties().SetClrType(mockComplexType);

            var modelConfiguration = new ModelConfiguration();
            var mockComplexTypeConfiguration = new Mock<ComplexTypeConfiguration>(mockComplexType.Object);
            var mockEntityTypeConfiguration = new Mock<EntityTypeConfiguration>(mockEntityType.Object);

            modelConfiguration.Add(mockComplexTypeConfiguration.Object);
            modelConfiguration.Add(mockEntityTypeConfiguration.Object);

            modelConfiguration.Configure(model);

            mockComplexTypeConfiguration.Verify(c => c.Configure(complexType));
            mockEntityTypeConfiguration.Verify(c => c.Configure(entityType, model));
        }