使用数据源


  数据源,即定义数据库的元数据,也称之为 Schema,包括表、字段、关系等等。数据源是生成代码的原材料,必不可少。

  CodeBuilder 支持 Database、 Power Designer、PDManer、DbSchema、Excel Schemanew 和 Swagger 六种。

一、从数据库读取

  从主菜单【数据源】处打开【Database】,显示 【数据源管理】 界面,如下图:

  CodeBuider 支持 SqlServer、MySql、Oracle、SQLite、PostgreSql、Firebird、达梦、人大金仓、神通,以及 Odbc 和 OleDb 驱动,此 Provider 基于 Fireasy.Data 提供 Schema,如果需要对接其他类型的数据库,你可以参阅 扩展数据源提供者。点击【添加】选择一种类型的数据库。

  输入连接字符串,或是通过单击【向导】按钮打开向导界面,根据表单来输入数据库连接的参数。

  配置好数据源后,在 数据源管理 的数据源列表中,双击打开数据库链接,将遍列数据库中的所有表。如下图:

  通过关键字筛选,勾选需要生成的表,你可以【暂存】多次筛选结构,最后一起返回。通过【SQL构造器】,通过输入多条 SQL 语句,返回特殊的结构,如下图:



💡 如何读取视图

  数据库视图默认是关闭的,如需读取视图,你可以在【文件】-【首选项】中勾选【读取视图】。


二、从 Power Designer 读取

  从主菜单【数据源】处打开【Power Designer】,打开选择 Power Designer 设计文件的对话框,选择文件后打开,显示模型浏览器,如下图所示:

  模型浏览器列出文档中的所有的 Package 和 Diagram 模型,以及 Table 对象,勾选好表对象后点击【确定】即可。


三、从 PDManer 读取

  操作与 Power Designer 类似。


四、从 DbSchema 读取

  操作与 Power Designer 类似。


五、从 Swagger 读取

  可以读取一个 swagger 的 json 文件,从中解析出 Model,一般前端模板可以使用 Swagger 数据源。


六、从 Excel 中获取

  如果连接不上数据库,或是暂不支持的数据库,可以将架构导出到 Excel 中,CodeBuilder 再从 Excel 中获取。
  选择 Excel Schema 后选择一个 Excel 文件,将预载 Excel 的结构,在蓝色背景行中单击编辑,下拉选择数据表(Table开头)或字段(Column开头)的属性,如下:

  设置好后点击【下一步】将列出所有表,勾选要生成的表即可,如下:



六、调整数据源

  通过以上方法选择好数据源后,CodeBuilder 将读取所有表的字段信息,显示到【对象列表中】,如下图所示:

  主键、外键和普通字段通过不同颜色的图标进行区分,同时,选中行并单击备注列,可以立即修改备注文本,回车即可生效。

  2.9.3 版本支持拖拽调整表或字段的前后顺序。


  当你选中表或字段时,在【属性】窗口实时显示表或字段的详细信息,在属性窗口里调整也会实时更新到【对象列表】中。如下图所示:

  外键可以通过以下步骤打开【外键关联】窗口,选择主表及主键进行【绑定】,点击【解绑】取消关系,如下所示:



💡 多说两句

  • 表的 ClassName 和字段的 PropertyName 是通过一定的规则进行自动转换的,可查阅 使用变量
  • 字段的 PropertyType 是依照 DbType 枚举来映射的,可查阅 架构扩展,如果有类型转换错误,可定位到文件 extensionsschemaase.cs,或在【扩展】窗口中找到 base.cs,找到方法 GetCSharpType 进行修改。代码如下:
// 获取 CSharp 的类型名称
public static string GetCSharpType(Column column)
{
    var propertyType = column.PropertyType;
    if (column.DbType == null)
    {
        return propertyType;
    }

    switch ((DbType)column.DbType)
    {
        case DbType.String:
        case DbType.StringFixedLength:
        case DbType.AnsiString:
        case DbType.AnsiStringFixedLength:
            propertyType = "string";
            break;
        case DbType.Int16:
            propertyType = "short";
            break;
        case DbType.UInt16:
            propertyType = "ushort";
            break;
        case DbType.Int32:
            propertyType = "int";
            break;
        case DbType.UInt32:
            propertyType = "uint";
            break;
        case DbType.Int64:
            propertyType = "long";
            break;
        case DbType.UInt64:
            propertyType = "ulong";
            break;
        case DbType.Decimal:
            propertyType = "decimal";
            break;
        case DbType.Single:
            propertyType = "float";
            break;
        case DbType.Double:
            propertyType = "double";
            break;
        case DbType.Boolean:
            propertyType = "bool";
            break;
        case DbType.Byte:
        case DbType.SByte:
            propertyType = column.Name.StartsWith("Is") ? "bool" : "int";
            break;
        case DbType.Date:
        case DbType.DateTime:
        case DbType.DateTime2:
        case DbType.DateTimeOffset:
            propertyType = "DateTime";
            break;
        case DbType.Guid:
            propertyType = "Guid";
            break;
        case DbType.Binary:
            propertyType = column.DataType == "timestamp" ? "DateTime" : "byte[]";
            break;
    }

    if (column.IsNullable && propertyType != "string" && column.DbType != DbType.Binary)
    {
        propertyType += "?";
    }

    return propertyType;
}

  而 Power Designer 数据源的 DbType 则是根据 configpd.cfg 文件来进行类型映射。如下所示:

{
    "MYSQL": {
        "smallint": "Int16",
        "int": "Int32",
        "real": "Double",
        "single": "Single",
        "float": "Double",
        "double": "Double",
        "money": "Decimal",
        "currency": "Decimal",
        "decimal": "Decimal",
        "numeric": "Decimal",
        "bit": "Boolean",
        "yesno": "Boolean",
        "logical": "Boolean",
        "bool": "Boolean",
        "boolean": "Boolean",
        "tinyint": "Byte",
        "integer": "Int64",
        "counter": "Int64",
        "autoincrement": "Int64",
        "identity": "Int64",
        "long": "Int64",
        "bigint": "Int64",
        "binary": "Binary",
        "varbinary": "Binary",
        "blob": "Binary",
        "image": "Binary",
        "general": "Binary",
        "oleobject": "Binary",
        "varchar": "String",
        "nvarchar": "String",
        "memo": "String",
        "longtext": "String",
        "note": "String",
        "text": "String",
        "ntext": "String",
        "string": "String",
        "char": "String",
        "nchar": "String",
        "datetime": "DateTime",
        "smalldate": "DateTime",
        "timestamp": "DateTime",
        "date": "DateTime",
        "time": "DateTime",
        "uniqueidentifier": "Currency",
        "guid": "Currency"
    },
    "MSSQLSRV": {
        "smallint": "Int16",
        "int": "Int32",
        "real": "Single",
        "float": "Double",
        "money": "Decimal",
        "smallmoney": "Decimal",
        "bit": "Boolean",
        "tinyint": "Byte",
        "bigint": "Int64",
        "timestamp": "Binary",
        "binary": "Binary",
        "image": "Binary",
        "text": "String",
        "ntext": "String",
        "decimal": "Decimal",
        "numeric": "Decimal",
        "datetime": "DateTime",
        "smalldatetime": "DateTime",
        "sql_variant": "Object",
        "xml": "String",
        "varchar": "String",
        "char": "String",
        "nchar": "String",
        "nvarchar": "String",
        "varbinary": "Binary",
        "uniqueidentifier": "String",
        "date": "DateTime",
        "time": "Object",
        "datetime2": "DateTime",
        "datetimeoffset": "Object"
    },
    "ORA": {
        "bfile": "Binary",
        "blob": "Binary",
        "char": "String",
        "clob": "String",
        "date": "DateTime",
        "float": "Decimal",
        "interval day to second": "Object",
        "interval year to month": "Int32",
        "long": "String",
        "integer": "Int32",
        "long raw": "Binary",
        "nchar": "String",
        "nclob": "String",
        "number": "Decimal",
        "nvarchar2": "String",
        "raw": "Binary",
        "rowid": "String",
        "timestamp": "DateTime",
        "timestamp with local time zone": "DateTime",
        "timestamp with time zone": "DateTime",
        "varchar2": "String"
    }
}

  如果你需要配置其他类型的数据库,需要找到 Power Designer 的 pdm 文件中的路径 //Model/o:RootObject/c:Children/o:Model/c:DBMS/o:DBMS/a:Code,根据 Code 的值来进行配置。


  表 Table 的基本元素:

编码 类型 名称
Index int 索引,从 1 开始
Name string 表的名称
Description string 表的注释
ClassName string 生成的对应的类名
Columns List<Column> 字段集合
PrimaryKeys List<Column> 主键集合
ForeignKeys List<Reference> 外键集合,可遍列主表
SubKeys List<Reference> 子键集合,可遍列子表
UniqueKeys List<Column> 唯一键集合3.3

  字段 Column 的基本元素:

编码 类型 名称
Index int 索引,从 1 开始
Name string 字段的名称
Description string 字段的注释
ColumnType string 字段类型定义,如 varchar(20)、integer、decimal(20,2) 等等
DataType string 字段类型,如 varchar、ingeter、decimal 等等
DbType DbType? 对应到 System.Data.DbType 枚举
PropertyName string 生成的对应的属性名称
PropertyType string 属性的类型,比如 C# 的 string、DateTime、int? 等等
IsPrimaryKey boolean 是否是主键
AutoIncrement boolean 是否为自增
IsNullable boolean 是否可为空
ForeignKey Reference 对应的外键对象 (Reference)
Length int? 字段长度,如 varchar(20) 长度为 20
Precision int? 精度
Scale int? 小数位数
IsUniqueKey boolean 是否唯一键3.3
Charset string 字符集3.4
Collation string 排列规则3.4
ChangeDetails List<ChangedProperty> 变更明细3.4

  关系 Reference 的基本元素:

编码 类型 名称
PkTable Table 主表
PkColumn Column 主键
FkTable Table 关联的表
FkColumn Column 关联的字段
OnUpdate Constraint 更新时的级联行为
OnDelete Constraint 删除时的级联行为