/// <inheritdoc />
        public void Set(IEntityMapping entityMapping, Iri owningEntity)
        {
            if (entityMapping != null)
            {
                IDictionary <Type, MergingEntityMapping> entityMappings;
                if (!ExplicitMappings.TryGetValue(owningEntity, out entityMappings))
                {
                    ExplicitMappings[owningEntity] = entityMappings = new ConcurrentDictionary <Type, MergingEntityMapping>();
                }

                MergingEntityMapping currentEntityMapping;
                if (!entityMappings.TryGetValue(entityMapping.Type, out currentEntityMapping))
                {
                    var newEntityMapping = entityMapping as MergingEntityMapping;
                    if (newEntityMapping != null)
                    {
                        entityMappings[entityMapping.Type] = newEntityMapping;
                        return;
                    }

                    entityMappings[entityMapping.Type] = currentEntityMapping = new MergingEntityMapping(entityMapping.Type);
                }

                foreach (var @class in entityMapping.Classes)
                {
                    currentEntityMapping.Classes.Add(@class);
                }

                foreach (var property in entityMapping.Properties)
                {
                    var existingMappings = currentEntityMapping.Properties.Where(item => item.Name == property.Name).ToList();
                    foreach (var existingMapping in existingMappings)
                    {
                        currentEntityMapping.Properties.Remove(existingMapping);
                    }

                    currentEntityMapping.Properties.Add(property);
                    foreach (var existingMapping in existingMappings)
                    {
                        currentEntityMapping.Properties.Add(existingMapping);
                    }
                }
            }
        }
        private static IEntityMapping BuildMapping <TEntity>(this ICollection <ITermMappingProvider> mappingProviders, out IPropertyMapping firstPropertyMapping)
        {
            firstPropertyMapping = null;
            var entityMapping = new MergingEntityMapping(typeof(TEntity));

            foreach (var mappingProvider in mappingProviders)
            {
                mappingProvider.Accept(MappingVisitors);
                var entityMappingProvider = mappingProvider as IEntityMappingProvider;
                if (entityMappingProvider != null)
                {
                    entityMapping.Classes.Add(new StatementMapping(entityMappingProvider.GetGraph(QIriMappings), entityMappingProvider.GetTerm(QIriMappings)));
                    continue;
                }

                var propertyMappingProvider = mappingProvider as IPropertyMappingProvider;
                if (propertyMappingProvider == null)
                {
                    continue;
                }

                ILiteralConverter valueConverter = null;
                if (propertyMappingProvider.ValueConverterType != null)
                {
                    valueConverter = ConverterProvider.FindConverter(propertyMappingProvider.ValueConverterType);
                }

                var collectionMappingProvider = mappingProvider as ICollectionMappingProvider;
                var propertyMapping           = (collectionMappingProvider != null
                    ? CollectionMapping.CreateFrom(entityMapping, collectionMappingProvider, valueConverter, QIriMappings)
                    : PropertyMapping.CreateFrom(entityMapping, propertyMappingProvider, valueConverter, QIriMappings));
                entityMapping.Properties.Add(propertyMapping);
                if (firstPropertyMapping == null)
                {
                    firstPropertyMapping = propertyMapping;
                }
            }

            return(entityMapping);
        }