/// <summary>
        /// Generates the entities.
        /// </summary>
        /// <param name="entitiesGenerationSettings">The entities generation settings.</param>
        public void GenerateEntities(EntitiesGenerationSettings entitiesGenerationSettings)
        {
            var fieldsFactory      = new FieldsFactory();
            var propsFactory       = new PropertiesFactory(entitiesGenerationSettings.Entities, _metadataRepository);
            var entityClassBuilder = new EntityClassBuilder(entitiesGenerationSettings.OutFolder);
            var entityModelBuilder = new EntityModelBuilder(entitiesGenerationSettings.OutFolder);
            var classFactory       = new ClassFactory();

            //build Entity class
            entityClassBuilder.Create(entitiesGenerationSettings.NameSpace);

            foreach (var entityMetadata in entitiesGenerationSettings.EntityMetadatas)
            {
                var classModel = classFactory.GetClassModel(entityMetadata, entitiesGenerationSettings.NameSpace);

                var relationshipMetadata = entityMetadata.OneToManyRelationships.Union(entityMetadata.ManyToOneRelationships).ToArray();

                classModel.Properties =
                    propsFactory.GetPropertyModels(entityMetadata.Attributes, relationshipMetadata);
                classModel.Fields =
                    fieldsFactory.GetFields(entityMetadata.Attributes);
                classModel.Schemas          = fieldsFactory.GetSchemaNames(entityMetadata.Attributes);
                classModel.PropertiesFields = fieldsFactory.GetProperties(entityMetadata.ManyToManyRelationships, entityMetadata.ManyToOneRelationships);

                //build model class
                entityModelBuilder.BuildClass(classModel, entitiesGenerationSettings.NameSpace);
            }
        }