数据库架构服务
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 构成,而 Oracle 对 Table 的架构查询,限制参数则由 TableSchema、TableName 构成。有关对架构查询的限制参数,可查询 Restriction 元数据。