数据库架构服务
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
元数据。