/// <summary>
        /// Получить индексы для сущности
        /// </summary>
        /// <param name="entity">Сущность</param>
        /// <param name="entityMapping">Mapping сущности</param>
        /// <exception cref="BadIndexColumnOrderException">Ошибка упарядочивания столбцов индекса</exception>
        /// <returns>Коллекия индексов</returns>
        private List<IndexInfo> GetIndexInfoCollection(Type entity, EntityMapping entityMapping)
        {
            var indexes = new List<IndexInfo>();
            var indexMemberInfoCollection = new List<IndexMemberInfo>();
            var indexIncludeInfoCollection = new List<IndexIncludeInfo>();

            var propertyMappings = entityMapping.PropertyMappings;
            var properties = entity.GetProperties();
            var indexAttributes = entity.GetCustomAttributes(typeof (IndexAttribute), inherit: false) as IEnumerable<IndexAttribute>;

            foreach (var propertyMapping in propertyMappings)
            {
                var property = properties.First(p => p.Name == propertyMapping.Property.Name);
                var indexMemberAttributes = property.GetCustomAttributes(typeof(IndexMemberAttribute), inherit: false) as IEnumerable<IndexMemberAttribute>;
                foreach (var indexMemberAttribute in indexMemberAttributes)
                {
                    indexMemberInfoCollection.Add(new IndexMemberInfo()
                    {
                        ColumnInfo = new ColumnInfo(entityMapping.TableInfo, propertyMapping.ColumnName),
                        IndexName = indexMemberAttribute.IndexName,
                        ColumnOrder = indexMemberAttribute.MemberOrder,
                        SortDirection = indexMemberAttribute.SortDirection
                    });
                }

                var indexIncludeAttributes = property.GetCustomAttributes(typeof(IndexIncludeAttribute), inherit: false) as IEnumerable<IndexIncludeAttribute>;
                foreach (var indexIncludeAttribute in indexIncludeAttributes)
                {
                    indexIncludeInfoCollection.Add(new IndexIncludeInfo()
                    {
                        ColumnInfo = new ColumnInfo(entityMapping.TableInfo, propertyMapping.ColumnName),
                        IndexName = indexIncludeAttribute.IndexName,
                        ColumnOrder = indexIncludeAttribute.IncludeOrder,
                    });
                }
            }

            foreach (var indexAttribute in indexAttributes)
            {
                var entityIndexInfo = new IndexInfo()
                {
                    Name = indexAttribute.Name,
                    IsClustered = indexAttribute.IsClustered,
                    IsUnique = indexAttribute.IsUnique,
                    TableInfo = entityMapping.TableInfo
                };

                var currentIndexMemberInfoCollection = indexMemberInfoCollection.Where(a => a.IndexName == indexAttribute.Name).ToList();
                var currentIndexIncludeInfoCollection = indexIncludeInfoCollection.Where(a => a.IndexName == indexAttribute.Name).ToList();

                try
                {
                    currentIndexMemberInfoCollection.Sort(CompareIndexInfoOrder);
                    currentIndexIncludeInfoCollection.Sort(CompareIndexInfoOrder);
                }
                catch (Exception ex)
                {
                    throw new BadIndexColumnOrderException("Ошибка упарядочивания столбцов индекса", ex);
                }

                entityIndexInfo.IndexMemberInfoCollection.AddRange(currentIndexMemberInfoCollection);
                entityIndexInfo.IndexIncludeInfoCollection.AddRange(currentIndexIncludeInfoCollection);

                indexes.Add(entityIndexInfo);
            }
            return indexes;
        }
        /// <summary>
        /// Получить mapping для сущности
        /// </summary>
        /// <param name="context">Контекст</param>
        /// <param name="entity">Сущность</param>
        /// <returns>Коллекция mapping</returns>
        private EntityMapping GetEntityMapping(DbContext context, Type entity)
        {
            var tableInfo = context.GetEntityTableNameWithSchema(entity);
            var propertyMappings = context.GetEntityPropertyMapping(entity);

            var entityMapping = new EntityMapping()
            {
                Entity = entity,
                TableInfo = tableInfo,
                PropertyMappings = propertyMappings
            };

            return entityMapping;
        }