/// <summary>
        /// When overriden in derived class, retrieves a collection of all
        /// references in the database defined by the <see cref="connectionString"/>.
        /// </summary>
        /// <param name="connectionString"></param>
        /// <param name="databaseSchema"></param>
        protected override void GetReferenceDefinitions(string connectionString, Core.SemanticModel.Schema databaseSchema)
        {
            WithDatabase(connectionString, delegate(Database database)
            {
                database.PrefetchObjects(typeof(Table));

                foreach (Table table in database.Tables)
                {
                    if (table.IsSystemObject)
                        continue;

                    foreach (ForeignKey foreignKey in table.ForeignKeys)
                    {
                        if (foreignKey.IsSystemNamed)
                            continue;

                        IReferenceDefinition referenceDefinition = GetReferenceDefinition(table, foreignKey);

                        ITableDefinition fkTable =
                            databaseSchema.GetTable(referenceDefinition.FkTableSchema, referenceDefinition.FkTable);
                        fkTable.AddReference(referenceDefinition);
                    } // foreach
                } // foreach
            });
        }
        /// <summary>
        /// When overriden in derived class, retrieves a collection of all
        /// indexes in the database defined by the <see cref="connectionString"/>.
        /// </summary>
        /// <param name="connectionString"></param>
        /// <param name="databaseSchema"></param>
        protected override void GetIndexDefinitions(string connectionString, Core.SemanticModel.Schema databaseSchema)
        {
            WithDatabase(connectionString, delegate(Database database)
            {
                database.PrefetchObjects(typeof(Table));

                foreach (Table table in database.Tables)
                {
                    if (table.IsSystemObject)
                        continue;

                    foreach (Index index in table.Indexes)
                    {
                        if (index.IsSystemNamed)
                            continue;

                        IIndexDefinition indexDefinition = GetIndexDefinition(table, index);
                        ITableDefinition indexTable = databaseSchema.GetTable(table.Schema, table.Name);

                        indexTable.AddIndex(indexDefinition);
                    } // foreach
                } // foreach
            });
        }