internal DBObjectIndexSchema(MetadataIndexDefinition indexDefinition, DBObjectTableSchemaAdapter objectSchemaAdapter) : base(objectSchemaAdapter) { if (indexDefinition == null) { throw new ArgumentNullException("indexDefinition"); } if (objectSchemaAdapter == null) { throw new ArgumentNullException("objectSchemaAdapter"); } this.IndexDefinition = indexDefinition; this.ObjectSchemaAdapter = objectSchemaAdapter; }
private List <MetadataIndexDefinition> GetIndexes() { List <MetadataIndexDefinition> indexes = new List <MetadataIndexDefinition>(); try { Dictionary <string, MetadataIndexDefinition> uniqueIndexes = new Dictionary <string, MetadataIndexDefinition>(); Type indexAttrType = typeof(MetadataIndexAttribute); foreach (MetadataPropertyDefinition property in this.AllMetadataProperties) { //если включена индексация по умолчанию, то добавляем индекс. bool indexedByColumn = property.Indexed; if (indexedByColumn) { string defaultIndexKey = property.ColumnName.ToLower(); if (uniqueIndexes.ContainsKey(defaultIndexKey)) { throw new Exception(string.Format("Индекс по умолчанию с ключом {0} уже добавлен в коллеккцию индексов.", defaultIndexKey)); } //добавляем индекс. В качестве имени столбца берем название свойства, т.к. имя может состоять из нескольких слов на русском. MetadataIndexDefinition columnIndex = new MetadataIndexDefinition(property.Property.Name, this); indexes.Add(columnIndex); uniqueIndexes.Add(defaultIndexKey, columnIndex); //устанавливаем, что индекс является дефалтовым для одного столбца columnIndex.CreatedByColumn = true; //добавляем столбец к индексу. MetadataIndexColumnDefinition indexColumn = new MetadataIndexColumnDefinition(property, false, 0); columnIndex.InitializingColumns.Add(indexColumn); } //добавляем индексы по атрибуту DBIndex object[] attrs = property.Property.GetCustomAttributes(indexAttrType, false); if (attrs.Length > 0) { foreach (MetadataIndexAttribute indexAttr in attrs) { if (indexAttr == null) { throw new Exception(string.Format("Не удалось получить DBIndexAttribute для свойства {0}.", property.Property.Name)); } if (string.IsNullOrEmpty(indexAttr.RelativeName)) { throw new Exception(string.Format("Не задано имя индекса в свойстве атрибута DBIndexAttribute.RelativeName для свойства {0}.", property.Property.Name)); } MetadataIndexDefinition index = null; string indexKey = indexAttr.RelativeName.ToLower(); if (uniqueIndexes.ContainsKey(indexKey)) { index = uniqueIndexes[indexKey]; if (index.CreatedByColumn) { throw new Exception(string.Format("Индекс {0} уже добавлен в коллекцию индексов при помощи атрибута Indexed.", index.RelativeName)); } } else { index = new MetadataIndexDefinition(indexAttr.RelativeName, this); indexes.Add(index); uniqueIndexes.Add(indexKey, index); } if (index == null) { throw new Exception(string.Format("Не удалось инициализировать индекс по ключу {0}.", indexKey)); } //добавляем столбец к индексу. MetadataIndexColumnDefinition indexColumn = new MetadataIndexColumnDefinition(property, indexAttr.IsDescending, indexAttr.ColumnOrder); index.InitializingColumns.Add(indexColumn); } } } } catch (Exception ex) { throw new Exception(string.Format("Ошибка при формировании коллекции индексов класса {0}.", this.Type.FullName), ex); } return(indexes); }