Skip to content

配置实体

entities 是配置文件中最核心的部分。每个实体对应一个数据库对象,实体配置决定了它如何呈现为 REST 端点、GraphQL 类型和 MCP 工具。

实体基本结构

json
{
  "entities": {
    "Book": {
      "source": { "object": "dbo.books", "type": "table" },
      "permissions": [
        { "role": "anonymous", "actions": ["read"] }
      ]
    }
  }
}

实体名(如 Book)区分大小写,直接决定 REST 路径(/api/Book)和 GraphQL 类型名。建议使用 PascalCase 单数命名。

source — 数据库对象映射

source 定义实体对应哪个数据库对象:

字段必需说明
object数据库对象名称,格式为 schema.name
type对象类型:tableviewstored-procedure
parameters存储过程存储过程的参数定义

* 视图没有显式主键,需要在 fields 数组中通过 primary-key: true 标记主键字段。未指定时 GET 按主键查询会退化为列表查询。

存储过程参数

json
{
  "source": {
    "type": "stored-procedure",
    "object": "dbo.get_book_by_id",
    "parameters": [
      {
        "name": "id",
        "required": true,
        "default": null,
        "description": "图书 ID"
      }
    ]
  }
}

参数使用数组格式(推荐),每个参数可指定 namerequireddefaultdescription。只有带默认值的参数可以省略。

permissions — 权限控制

每个实体必须配置至少一个权限。未配置权限的实体拒绝所有访问:

json
{
  "permissions": [
    { "role": "anonymous",    "actions": ["read"] },
    { "role": "authenticated","actions": ["read", "create"] },
    { "role": "editor",       "actions": ["read", "create", "update"] },
    { "role": "admin",        "actions": ["*"] }
  ]
}

动作(actions)

动作适用对象说明
read表、视图查询数据
create表、视图插入新记录
update表、视图修改已有记录
delete表、视图删除记录
execute存储过程执行存储过程
*全部通配符,等于该类型支持的全部操作

字段过滤

按角色精确控制可访问的字段:

json
{
  "role": "auditor",
  "actions": [
    {
      "action": "read",
      "fields": {
        "include": ["*"],
        "exclude": ["salary", "password_hash"]
      }
    }
  ]
}

数据库策略

行级数据过滤,策略被转换为 SQL WHERE 条件:

json
{
  "action": "read",
  "policy": {
    "database": "@item.ownerId eq @claims.userId"
  }
}

@item.<field> 引用实体字段,@claims.<claim> 引用用户令牌声明。策略仅适用于 readupdatedelete

fields — 字段映射

为数据库字段定义别名、描述和主键标记:

json
{
  "fields": [
    { "name": "sku_product_title", "alias": "title" },
    { "name": "id", "primary-key": true }
  ]
}
字段说明
name数据库字段名(必需)
aliasAPI 中的公开名称
primary-key标记为主键(替代已弃用的 source.key-fields
description字段描述(用于 MCP 和文档)

rest — REST 端点控制

json
{
  "rest": {
    "enabled": true,
    "path": "shopping-cart/item",
    "methods": ["GET", "POST"]
  }
}
字段说明默认值
enabled是否生成 REST 端点true
path自定义路径,支持子目录实体名
methods允许的 HTTP 方法(仅存储过程)["POST"]

graphql — GraphQL 控制

json
{
  "graphql": {
    "enabled": true,
    "type": { "singular": "Book", "plural": "Books" },
    "operation": "query"
  }
}
字段说明默认值
enabled是否出现在 GraphQL 架构中true
type自定义类型名(单数/复数)实体名
operation存储过程的挂载位置:querymutationmutation

relationships — 实体关系

定义实体间的关联,在 GraphQL 中自动生成嵌套查询:

json
{
  "relationships": {
    "book_authors": {
      "cardinality": "many",
      "target.entity": "Author",
      "source.fields": ["id"],
      "target.fields": ["book_id"]
    }
  }
}
基数说明
one一对一或多对一
many一对多或多对多

多对多关系需要额外指定 linking.objectlinking.source.fieldslinking.target.fields。关系仅在 GraphQL 中生效,REST 不支持嵌套查询。

cache — 实体级缓存

json
{
  "cache": {
    "enabled": true,
    "ttl-seconds": 60,
    "level": "L1L2"
  }
}
字段说明默认值
enabled启用缓存false
ttl-seconds缓存生存时间(秒)继承全局值
levelL1(仅内存)或 L1L2(内存+分布式)L1L2

缓存仅在 REST 端点生效。数据发生增删改时缓存自动失效。

health — 实体级健康检查

json
{
  "health": {
    "enabled": true,
    "first": 10,
    "threshold-ms": 500
  }
}
字段说明默认值
enabled是否将该实体纳入健康检查true
first健康检查查询返回的行数(范围:1-500)100
threshold-ms健康检查查询的最大持续时间(毫秒)1000

first 值应小于或等于 runtime.pagination.max-page-size 设置。较小的值有助于健康检查更快完成。

注意: 存储过程自动从实体健康检查中排除,因为它们需要参数且可能不是确定性的。

mcp — MCP 工具控制

json
{
  "mcp": {
    "dml-tools": true,
    "custom-tool": false
  }
}
字段说明默认值
dml-tools是否向 MCP 代理暴露 DML 工具true
custom-tool是否将存储过程注册为命名 MCP 工具(仅存储过程)false

description — 语义描述

json
{
  "description": "图书信息表,包含书名、作者、出版年份和价格"
}

描述出现在 MCP 工具定义和生成的 API 文档中,帮助 API 消费者和 AI 代理理解数据含义。

使用 CLI 管理实体

bash
# 添加表实体
dab add Book --source "dbo.books" --permissions "anonymous:read"

# 添加存储过程实体
dab add GetBook --source "dbo.get_book_by_id" --source.type "stored-procedure" --permissions "anonymous:execute"

# 更新实体权限
dab update Book --permissions "authenticated:*"

CLI 命令会直接修改配置文件,你也可以手动编辑 JSON 后再运行 dab validate 校验。

下一步

数据墙DBW 产品文档与开发指南。