internal DBObjectIndexColumnSchema(MetadataIndexColumnDefinition indexColumnDefinition, DBObjectIndexSchema objectIndexSchema)
            : base(objectIndexSchema)
        {
            if (indexColumnDefinition == null)
            {
                throw new ArgumentNullException("indexColumnDefinition");
            }
            if (objectIndexSchema == null)
            {
                throw new ArgumentNullException("objectIndexSchema");
            }

            this.IndexColumnDefinition = indexColumnDefinition;
            this.ObjectIndexSchema     = objectIndexSchema;
        }
        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);
        }