private ReferenceComponentMapping CreateInstance()
        {
            var property = new DummyPropertyInfo("ComponentProperty", typeof(ComponentTarget)).ToMember();
            var instance = new ReferenceComponentMapping(ComponentType.Component, property, typeof(ComponentTarget), typeof(Target), null);

            instance.AssociateExternalMapping(new ExternalComponentMapping(ComponentType.Component));

            return instance;
        }
        public override void ProcessComponent(ReferenceComponentMapping mapping)
        {
            var providers = componentProviders.Where(x => x.Type == mapping.Type);

            if (!providers.Any())
                throw new MissingExternalComponentException(mapping.Type, mapping.ContainingEntityType, mapping.Member);
            if (providers.Count() > 1)
                throw new AmbiguousComponentReferenceException(mapping.Type, mapping.ContainingEntityType, mapping.Member);

            mapping.AssociateExternalMapping(providers.Single().GetComponentMapping());
        }
        public override void ProcessComponent(ReferenceComponentMapping mapping)
        {
            var context = new ComponentResolutionContext
            {
                ComponentType = mapping.Type,
                ComponentMember = mapping.Member,
                EntityType = mapping.ContainingEntityType
            };
            var component = resolvers
                .Select(x => x.Resolve(context, componentProviders))
                .FirstOrDefault(x => x != null);

            if (component == null)
                throw new MissingExternalComponentException(mapping.Type, mapping.ContainingEntityType, mapping.Member);

            mapping.AssociateExternalMapping(component);
            mapping.MergedModel.AcceptVisitor(this);
        }
        public override void establish_context()
        {
            visitor = new ComponentColumnPrefixVisitor();
            reference_with_a_prefix = new ReferenceComponentMapping(new DummyPropertyInfo("PROPERTY", typeof(Target)).ToMember(), typeof(ComponentTarget), typeof(Target), column_prefix);
            reference_with_a_prefix.AssociateExternalMapping(new ExternalComponentMapping());

            reference_without_a_prefix = new ReferenceComponentMapping(new DummyPropertyInfo("PROPERTY", typeof(Target)).ToMember(), typeof(ComponentTarget), typeof(Target), null);

            var external_mapping = new ExternalComponentMapping();
            external_mapping.AddProperty(property_with_column("propertyColumn"));

            reference_without_a_prefix.AssociateExternalMapping(external_mapping);
        }
        public override void establish_context()
        {
            visitor = new ComponentColumnPrefixVisitor();
            reference_with_a_prefix = new ReferenceComponentMapping(new DummyPropertyInfo("PROPERTY", typeof(Target)).ToMember(), typeof(ComponentTarget), typeof(Target), column_prefix);

            var external_mapping = new ExternalComponentMapping();

            external_mapping.AddAny(any_with_column("anyColumn"));
            external_mapping.AddCollection(collection_with_column("collectionColumn"));

            var component = new ComponentMapping();
            component.AddProperty(property_with_column("componentPropertyColumn"));

            external_mapping.AddComponent(component);
            external_mapping.AddProperty(property_with_column("propertyColumn"));
            external_mapping.AddReference(reference_with_column("referenceColumn"));

            reference_with_a_prefix.AssociateExternalMapping(external_mapping);
        }
        public override void establish_context()
        {
            visitor = new ComponentColumnPrefixVisitor();
            reference_with_a_prefix = new ReferenceComponentMapping(new DummyPropertyInfo("PROPERTY", typeof(Target)).ToMember(), typeof(ComponentTarget), typeof(Target), first_prefix);
            reference_with_a_prefix.AssociateExternalMapping(new ExternalComponentMapping());

            var sub_component = new ReferenceComponentMapping(new DummyPropertyInfo("PROPERTY", typeof(Target)).ToMember(), typeof(ComponentTarget), typeof(Target), second_prefix);

            var sub_component_mapping = new ExternalComponentMapping();
            sub_component_mapping.AddProperty(property_with_column("propertyColumn"));

            sub_component.AssociateExternalMapping(sub_component_mapping);

            reference_with_a_prefix.AssociateExternalMapping(new ExternalComponentMapping());
            reference_with_a_prefix.AddComponent(sub_component);
        }