数据库架构服务


  ISchemaProvider 提供对数据库架构元数据的获取,比如库、表、字段、存储过程、数据类型、外键等等,具体可查阅 SchemaCatalog 枚举,名称及说明见如下表格:

类型 说明
Database 数据库,主要有名称和创建时间
MetadataCollection 元数据集合,主要有名称及限制数
DataType 数据类型,主要有名称及DbType和 .Net 类型
ReservedWord 保留关键字
Restriction 限制条件,主要有名称及位置
User 用户,主要有名称和创建时间
Table 表,主要有分录、架构、名称、类型及说明
View 视图,主要有分录、架构、名称及说明
Column 表的字段,主要有分录、架构、表名称、数据类型、是否主键及说明等
ViewColumn 视图的字段,主要有分录、架构、视图名称、名称、数据类型、是否主键及说明等
Procedure 存储过程,主要有分录、架构、名称及类型
ProcedureParameter 存储过程的参数,主要有分录、架构、名称、数据类型、方向等
Index 索引,主要有分录、架构、表名称、是否唯一、是否主键
IndexColumn 索引的字段,主要有分录、架构、名称、表名称、索引名称及字段名称
ForeignKey 外键,主要有分录、架构、名称、字段名称、父表名称、主键名称

  下面的代码演示的是获取所有表:
private void PrintSchema(ISchemaMetadata metadata)
{
    Console.WriteLine();
    var flag = new AssertFlag();
    foreach (var property in metadata.GetType().GetProperties())
    {
        if (!flag.AssertTrue())
        {
            Console.Write(",    ");
        }
        Console.Write("{0}: {1}", property.Name, property.GetValue(metadata, null));
    }
}

[TestMethod]
public void TestGetTables()
{
    using (var db = DatabaseFactory.CreateDatabase())
    {
        var schema = db.Provider.GetService<ISchemaProvider>();
        if (schema == null)
        {
            Console.WriteLine("不支持架构服务。");
            return;
        }

        foreach (var table in schema.GetSchemas<Table>(database))
        {
            PrintSchema(table);
        }
    }
}

  GetSchemas 方法也可以使用简单的 lambda 表达式查询,前提是该属性必须是架构查询的限制参数之一。

[TestMethod]
public void TestQueryTables()
{
    using (var db = DatabaseFactory.CreateDatabase())
    {
        var schema = db.Provider.GetService<ISchemaProvider>();
        if (schema == null)
        {
            Console.WriteLine("不支持架构服务。");
            return;
        }

        foreach (var table in schema.GetSchemas<Table>(database, s => s.TableName == "products"))
        {
            PrintSchema(table);
        }
    }
}

  属性的查询通过 SchemaQueryableAttribute 特性来指定,该特性的 Index 表示该属性在限制数组中的索引位置。在使用该方法之前,你必须对 DbConnection.GetSchema 方法的限制参数数组有所了解。 如 SqlServer 中对 Table 的架构查询,限制参数由 TableCatalog、TableSchema、TableName 和 TableType 构成,而 OracleTable 的架构查询,限制参数则由 TableSchema、TableName 构成。有关对架构查询的限制参数,可查询 Restriction 元数据。