使用 CatFactory.UI 文档 SQL Server 数据库
使用 CatFactory.UI 文档 SQL Server 数据库
引言
在企业中,拥有文档是一个好习惯,通常我们会为源代码编写文档,至少我们会在源代码中添加注释来解释实现细节,但数据库的情况并非如此。
一些公司会在企业门户中有一个目录,其中包含(Word)文档,里面是所有数据库的文档。
在本指南中,我们将使用 CatFactory.SqlServer
包来添加或更新表、表列、视图和视图列的描述。
还有其他选项可以记录 SQL Server 数据库,例如:Dataedo,但这个项目是展示 CatFactory 可能性的一个好机会。
背景
CatFactory 提供数据库的架构:表、视图和其他对象; CatFactory.SqlServer
包开发团队增加了从数据库导入扩展属性的改进,通常开发人员使用 MS_Description 扩展属性来存储描述。
因此,CatFactory 会检索 MS_Description 扩展属性的所有值,并将这些值添加到 CatFactory 定义的 Description 属性中。
有一个关于使用 CatFactory 生成数据字典的技巧,很快就会有一个更新的技巧,以便使用最新版本的 CatFactory.SqlServer
包。
数据库
请查看示例数据库以了解架构中的每个组件。在此数据库中有 4 个架构:Dbo、HumanResources、Warehouse 和 Sales。
每个架构代表商店公司的一个部门,请记住这一点,因为所有代码的设计都遵循这个方面;目前此代码仅实现 Production
和 Sales
架构的功能。
所有表都有一个包含一列的主键,并包含用于创建、上次更新和并发令牌的列。
您可以在此链接找到数据库脚本:GitHub 上的在线商店数据库脚本。
请记住:这只是一个示例数据库,仅用于概念演示。
架构 | 名称 |
---|---|
dbo
| 变更日志
|
dbo
| 变更日志排除
|
dbo
| 国家
|
dbo
| 国家货币
|
dbo
| 货币
|
dbo
| EventLog(事件日志)
|
人力资源
| 员工
|
人力资源
| 员工地址
|
人力资源
| 员工邮箱
|
销售
| 客户
|
销售
| 订单明细
|
销售
| 订单头
|
销售
| 订单状态
|
销售
| 支付方式
|
销售
| 发货人
|
仓库
| Location
|
仓库
| 产品
|
仓库
| 产品类别
|
仓库
| 产品库存
|
使用代码
CatFactory 的第一个概念是导入现有数据库。
为了添加文档,我们需要安装 CatFactory.SqlServer
包
名称 | 版本 | |
---|---|---|
CatFactory.SqlServer | 1.0.0-beta-sun-build16 | 允许从 SQL Server 实例导入现有数据库 |
要开始记录,请从 SQL Server 实例导入数据库
// Create instance for database factory
var databaseFactory = new SqlServerDatabaseFactory
{
DatabaseImportSettings = new DatabaseImportSettings
{
ConnectionString = "server=(local);database=Store;integrated security=yes;",
ExtendedProperties =
{
"MS_Description"
}
}
};
// Import database
var database = databaseFactory.Import();
Import
方法会提取表、视图以及表和视图中列的扩展属性,调用 fn_listextendedproperty
表函数以检索扩展属性。
这是 ExtendedProperty
类的定义
using System.Diagnostics;
namespace CatFactory.Mapping
{
[DebuggerDisplay("Name={Name}, Value={Value}")]
public class ExtendedProperty
{
public ExtendedProperty();
public string Name { get; set; }
public string Value { get; set; }
public string Level0Type { get; set; }
public string Level0Name { get; set; }
public string Level1Type { get; set; }
public string Level1Name { get; set; }
public string Level2Type { get; set; }
public string Level2Name { get; set; }
}
}
读取扩展属性
// Get table from database
var table = database.FindTable("Production.Product");
// Get extended properties for table
foreach (var extendedProperty in table.ExtendedProperties)
{
Console.WriteLine("Name: '{0}', Value: '{1}'", extendedProperty.Name, extendedProperty.Value);
}
SqlServerDatabaseFactory 的扩展方法
名称 | 描述 |
---|---|
AddExtendedProperty | 为数据库对象添加扩展属性 |
UpdateExtendedProperty | 更新数据库对象的扩展属性 |
AddOrUpdateExtendedProperty | 添加或更新数据库对象的扩展属性 |
DropExtendedProperty | 删除数据库对象的扩展属性 |
这些方法允许管理表、视图以及表和视图中列的扩展属性。
处理表
为表添加扩展属性
// Get table from database
var table = database.FindTable("Production.Product");
// Add extended property
databaseFactory.AddExtendedProperty(table, "MS_Description", "Products catalog");
为表中的列添加扩展属性
// Get table from database
var table = database.FindTable("Production.Product");
// Get column from table
var column = table.GetColumn("ProductName");
// Add extended property
databaseFactory.AddExtendedProperty(table, column, "MS_Description", "Name for product");
AddExtendedProperty
方法调用 sp_addextendedproperty
存储过程。
更新表的扩展属性
// Get table from database
var table = database.FindTable("Production.Product");
// Update extended property
databaseFactory.UpdateExtendedProperty(table, "MS_Description", "Products catalog for store");
更新表中列的扩展属性
// Get table from database
var table = database.FindTable("Production.Product");
// Get column from table
var column = table.GetColumn("UnitPrice");
// Update extended property
databaseFactory.UpdateExtendedProperty(table, column, "MS_Description", "Unit price for product in USD");
UpdateExtendedProperty
方法调用 sp_updateextendedproperty
存储过程。
为表添加或更新扩展属性
// Get table from database
var table = database.FindTable("Production.Product");
// Update extended property
databaseFactory.AddOrUpdateExtendedProperty(table, "MS_Description", "Products catalog for store");
为表中的列添加或更新扩展属性
// Get table from database
var table = database.FindTable("Production.Product");
// Get column from table
var column = table.GetColumn("Description");
// Update extended property
databaseFactory.AddOrUpdateExtendedProperty(table, "MS_Description", "Description for product");
AddOrUpdateExtendedProperty
方法调用 sp_addextendedproperty
或 sp_updateextendedproperty
存储过程。
删除表的扩展属性
// Get table from database
var table = database.FindTable("Production.Product");
// Update extended property
databaseFactory.DropExtendedProperty(table, "MS_Description");
删除表中列的扩展属性
// Get table from database
var table = database.FindTable("Production.Product");
// Get column from table
var column = table.GetColumn("UnitPrice");
// Update extended property
databaseFactory.DropExtendedProperty(table, column, "MS_Description");
DropExtendedProperty
方法调用 sp_dropextendedproperty
存储过程。
处理视图
为视图添加扩展属性
// Get view from database
var view = database.FindView("Sales.OrderSummary");
// Add extended property
databaseFactory.AddExtendedProperty(view, "MS_Description", "Summary for orders");
为视图中的列添加扩展属性
// Get view from database
var view = database.FindView("Sales.OrderSummary");
// Get column from view
var column = view.GetColumn("ShipperName");
// Add extended property
databaseFactory.AddExtendedProperty(view, column, "MS_Description", "Name for shipper");
AddExtendedProperty
方法调用 sp_addextendedproperty
存储过程。
更新视图的扩展属性
// Get view from database
var view = database.FindView("Sales.OrderSummary");
// Update extended property
databaseFactory.UpdateExtendedProperty(view, "MS_Description", "Details information for orders");
更新视图中列的扩展属性
// Get view from database
var view = database.FindView("Sales.OrderSummary");
// Get column from view
var column = view.GetColumn("Total");
// Update extended property
databaseFactory.UpdateExtendedProperty(view, column, "MS_Description", "Total for order in USD");
UpdateExtendedProperty
方法调用 sp_updateextendedproperty
存储过程。
为视图添加或更新扩展属性
// Get view from database
var view = database.FindView("Sales.OrderSummary");
// Update extended property
databaseFactory.AddOrUpdateExtendedProperty(view, "MS_Description", "Details information for orders in store");
为视图中的列添加或更新扩展属性
// Get view from database
var view = database.FindView("Sales.OrderSummary");
// Get column from view
var column = view.GetColumn("Total");
// Update extended property
databaseFactory.AddOrUpdateExtendedProperty(view, "MS_Description", "Total for order in USD");
AddOrUpdateExtendedProperty
方法调用 sp_addextendedproperty
或 sp_updateextendedproperty
存储过程。
删除视图的扩展属性
// Get view from database
var view = database.FindView("Sales.OrderSummary");
// Update extended property
databaseFactory.DropExtendedProperty(view, "MS_Description");
删除视图中列的扩展属性
// Get view from database
var view = database.FindView("Sales.OrderSummary");
// Get column from view
var column = view.GetColumn("CurrencyName");
// Update extended property
databaseFactory.DropExtendedProperty(view, column, "MS_Description");
DropExtendedProperty
方法调用 sp_dropextendedproperty
存储过程。
上面的代码使用 MS_Description
,但在代码中我们可以使用其他扩展属性。
使用 UI
CatFactory 的 UI 允许使用图形界面编辑扩展属性。
此客户端调用 CatFactory.SqlServer
包中的相同方法。
设置
后端
先决条件:.NET Core 2
使用 Visual Studio
- 打开位于 Back-end 目录中的
CatFactory.UI.API
解决方案 - 将
CatFactory.UI.API
设置为启动项目 - 重新生成解决方案
- 在 launchSettings.json 文件中(对于 iisSettings 和
CatFactory.UI.API
配置文件)将端口号设置为 8400 - 运行
CatFactory.UI.API
项目
确保 API 在端口 8400 上运行
使用命令行
- 打开位于 Back-end 目录中的
CatFactory.UI.API
目录的命令行终端 - 运行 "dotnet restore" 命令以恢复所有 nuget 包
- 运行 "dotnet run" 命令以运行
CatFactory.UI.API
项目
Back-end 引用了 CatFactory.SqlServer
包。
前端
先决条件:NodeJS,Angular CLI
- 打开位于 Front-end 目录中的
CatFactoryUI
目录的命令行 - 运行 "npm install" 命令以安装所有 nodejs 包
- 运行 "ng serve" 以在端口 4200 上启动项目
记录现有数据库
此客户端包含以下视图
Dashboard
:显示已导入的数据库。Import
:允许从 SQL Server 实例导入现有数据库。Database details
:显示已导入数据库的详细信息。Table details
:显示所选表的详细信息。View details
:显示所选视图的详细信息。Edit description
:允许编辑数据库对象的描述。
此客户端仅处理 MS_Description
,但我们可以在 C# 代码中更改扩展属性。
转到仪表板,最初没有任何数据库
转到导入,此视图允许导入现有数据库
设置名称和连接字符串以导入现有数据库,此外我们还可以禁用要导入的表和视图。
现在我们可以在仪表板视图中看到数据库了
一旦我们从列表中选择一个数据库,我们就可以看到数据库的详细信息,例如表、视图和数据库类型映射
我们可以选择一个表来查看详细信息
在详细信息视图中,我们可以编辑表的描述
我们还可以编辑列的描述
对于视图和视图的列,过程也一样。
代码改进
- 允许为数据库添加描述
- 允许为索引添加描述
- 允许为表函数添加描述
- 允许为存储过程添加描述
- 添加导出功能(Word、PDF、HTML)
关注点
- Description 字段在 UI 中不是必需的,因为在某些情况下我们想清除对象的描述
历史
- 2018年7月15日:初始版本
- 2018年10月4日:添加了表和视图的代码部分和操作说明