/// <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; }