/// <summary>
        /// Gets the primary key for a table.
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        public virtual PrimaryKeyColumnSchema GetPrimaryKey(TableSchema table)
        {
            PrimaryKeyColumnSchema result = null;
            if (table == null)
                return result;

            string cmdtext = @"
            select
            columnproperty(object_id(c.table_name), c.column_name, 'IsIdentity') as is_identity,
            c.*
            from information_schema.table_constraints tc
            inner join information_schema.key_column_usage kcu
            on kcu.constraint_name = tc.constraint_name
            and kcu.table_name = tc.table_name
            inner join information_schema.columns c
            on c.table_name = kcu.table_name
            and c.column_name = kcu.column_name
            where tc.constraint_type = 'PRIMARY KEY'
            and c.table_name = @table_name
            ";
            using (SqlCommand cmd = new SqlCommand(cmdtext))
            {
                cmd.Parameters.Add("@table_name", SqlDbType.NVarChar, 128).Value = table.Name;
                using (IDataReader reader = this._helper.ExecuteReader(cmd))
                {
                    if (reader.Read())
                    {
                        SqlDbType sqlType = Enum<SqlDbType>.Parse(reader["DATA_TYPE"].ToString());
                        Type dataType = getDataType(reader["DATA_TYPE"].ToString());
                        string name = reader["COLUMN_NAME"].ToString();
                        Dictionary<string, object> props = new Dictionary<string, object>();
                        props.Add("is_identity", Convert.ToBoolean(reader["is_identity"]));
                        int length = reader["CHARACTER_MAXIMUM_LENGTH"] != DBNull.Value ? System.Convert.ToInt32(reader["CHARACTER_MAXIMUM_LENGTH"]) : -1;
                        props.Add("is_primary_key", true);
                        props.Add("is_foreign_key", false);
                        props.Add("is_nullable", (reader["is_nullable"].ToString().Equals("YES")));
                        result = new PrimaryKeyColumnSchema(this, table, sqlType, dataType, name, length, props);
                    }
                }

            }
            return result;
        }
 /// <summary>
 /// Gets all of the objects representing tables that have references to a primary key.
 /// </summary>
 /// <param name="primaryKey"></param>
 /// <returns></returns>
 public virtual ForeignKeyColumnSchemaList GetForeignKeyReferences(PrimaryKeyColumnSchema primaryKey)
 {
     ForeignKeyColumnSchemaList result = new ForeignKeyColumnSchemaList();
     string cmdtext = @"
     select distinct
     col_name(fc.parent_object_id, fc.parent_column_id) as foreign_key_column,
     object_name(fc.parent_object_id) as foreign_key_table,
     col_name(fc.referenced_object_id, fc.referenced_column_id) as primary_key_column,
     object_name(fc.referenced_object_id) as primary_key_table,
     c.data_type,
     c.character_maximum_length,
     c.is_nullable,
     c.table_name,
     c.column_name
     from sys.foreign_keys as f
     inner join sys.foreign_key_columns as fc
     on f.object_id = fc.constraint_object_id
     inner join information_schema.columns c
     on c.column_name = col_name(fc.parent_object_id, fc.parent_column_id)
     and c.table_name = object_name(f.parent_object_id)
     where object_name (f.referenced_object_id) =  @table_name
     ";
     using (SqlCommand cmd = new SqlCommand(cmdtext))
     {
         cmd.Parameters.Add("@table_name", SqlDbType.NVarChar, 128).Value = primaryKey.Table.Name;
         using (IDataReader reader = this._helper.ExecuteReader(cmd))
         {
             while (reader.Read())
             {
                 string tableName = reader["TABLE_NAME"].ToString();
                 SqlDbType sqlType = Enum<SqlDbType>.Parse(reader["DATA_TYPE"].ToString());
                 Type dataType = getDataType(reader["DATA_TYPE"].ToString());
                 string name = reader["COLUMN_NAME"].ToString();
                 Dictionary<string, object> props = new Dictionary<string, object>();
                 props.Add("is_identity", false);
                 int length = reader["CHARACTER_MAXIMUM_LENGTH"] != DBNull.Value ? System.Convert.ToInt32(reader["CHARACTER_MAXIMUM_LENGTH"]) : -1;
                 props.Add("is_primary_key", false);
                 props.Add("is_foreign_key", true);
                 props.Add("primary_key_table", reader["primary_key_table"]);
                 props.Add("primary_key_column", reader["primary_key_column"]);
                 props.Add("foreign_key_column", reader["foreign_key_column"]);
                 props.Add("foreign_key_table", reader["foreign_key_table"]);
                 props.Add("is_nullable", (reader["is_nullable"].ToString().Equals("YES")));
                 result.Add(new ForeignKeyColumnSchema(this, new TableSchema(this, tableName), sqlType, dataType, name, length, props));
             }
         }
     }
     return result;
 }