/// <summary>
        /// Initializes a new instance of the PrimitiveDataTypeRepositoryBase class.
        /// </summary>
        /// <param name="dataGenerationHintsResolver">Data generation hints resolver.</param>
        protected PrimitiveDataTypeRepositoryBase(IPrimitiveDataTypeToDataGenerationHintsResolver dataGenerationHintsResolver)
        {
            ExceptionUtilities.CheckArgumentNotNull(dataGenerationHintsResolver, "dataGenerationHintsResolver");

            this.RandomDataGeneratorResolver = new RandomDataGeneratorResolver();
            this.UniqueDataGeneratorResolver = new UniqueDataGeneratorResolver();
            this.DataGenerationHintsResolver = dataGenerationHintsResolver;
        }
        /// <summary>
        /// Initializes a new instance of the PrimitiveDataTypeRepositoryBase class.
        /// </summary>
        /// <param name="dataGenerationHintsResolver">Data generation hints resolver.</param>
        protected PrimitiveDataTypeRepositoryBase(IPrimitiveDataTypeToDataGenerationHintsResolver dataGenerationHintsResolver)
        {
            ExceptionUtilities.CheckArgumentNotNull(dataGenerationHintsResolver, "dataGenerationHintsResolver");

            this.RandomDataGeneratorResolver = new RandomDataGeneratorResolver();
            this.UniqueDataGeneratorResolver = new UniqueDataGeneratorResolver();
            this.DataGenerationHintsResolver = dataGenerationHintsResolver;
        }
        /// <summary>
        /// Resolves data generation hints for the entity model.
        /// </summary>
        /// <param name="model">The entity model to resolve data generation hints for.</param>
        /// <param name="dataGenerationHintsResolver">The data generation hints resolver.</param>
        public void ResolveDataGenerationHints(EntityModelSchema model, IPrimitiveDataTypeToDataGenerationHintsResolver dataGenerationHintsResolver)
        {
            ExceptionUtilities.CheckArgumentNotNull(model, "model");
            ExceptionUtilities.CheckArgumentNotNull(dataGenerationHintsResolver, "dataGenerationHintsResolver");

            foreach (ComplexType comlexType in model.ComplexTypes)
            {
                Resolve(comlexType.Properties, dataGenerationHintsResolver);
            }

            foreach (EntityType entityType in model.EntityTypes)
            {
                Resolve(entityType.Properties, dataGenerationHintsResolver);
            }
        }
        /// <summary>
        /// Resolves data generation hints for the entity model.
        /// </summary>
        /// <param name="model">The entity model to resolve data generation hints for.</param>
        /// <param name="dataGenerationHintsResolver">The data generation hints resolver.</param>
        public void ResolveDataGenerationHints(EntityModelSchema model, IPrimitiveDataTypeToDataGenerationHintsResolver dataGenerationHintsResolver)
        {
            ExceptionUtilities.CheckArgumentNotNull(model, "model");
            ExceptionUtilities.CheckArgumentNotNull(dataGenerationHintsResolver, "dataGenerationHintsResolver");
            
            foreach (ComplexType comlexType in model.ComplexTypes)
            {
                Resolve(comlexType.Properties, dataGenerationHintsResolver);
            }

            foreach (EntityType entityType in model.EntityTypes)
            {
                Resolve(entityType.Properties, dataGenerationHintsResolver);
            }
        }
        private static void Resolve(IEnumerable <MemberProperty> properties, IPrimitiveDataTypeToDataGenerationHintsResolver dataGenerationHintsResolver)
        {
            foreach (MemberProperty property in properties)
            {
                var collectionType = property.PropertyType as CollectionDataType;

                var elementType = collectionType != null ? collectionType.ElementDataType : property.PropertyType;

                var primitiveDataType = elementType as PrimitiveDataType;
                if (primitiveDataType != null)
                {
                    var hints = dataGenerationHintsResolver.ResolveDataGenerationHints(primitiveDataType).ToList();
                    property.WithDataGenerationHints(hints.ToArray());
                }
            }
        }
        private static void Resolve(IEnumerable<MemberProperty> properties, IPrimitiveDataTypeToDataGenerationHintsResolver dataGenerationHintsResolver)
        {
            foreach (MemberProperty property in properties)
            {
                var collectionType = property.PropertyType as CollectionDataType;

                var elementType = collectionType != null ? collectionType.ElementDataType : property.PropertyType;

                var primitiveDataType = elementType as PrimitiveDataType;
                if (primitiveDataType != null)
                {
                    var hints = dataGenerationHintsResolver.ResolveDataGenerationHints(primitiveDataType).ToList();
                    property.WithDataGenerationHints(hints.ToArray());
                }
            }
        }