跳到主要内容

实现

版权声明

备忘

  • 在需要通过被关联对象的某个属性查询时,可以定义别名并映射到目标属性上, 然后,在 XMeta 中设置别名为可查询的即可。如,定义别名映射 appId -> module.appId,再设置可查询 <prop name="appId" queryable="true" />
  • io.nop.biz.crud.CrudBizModel#asDict 可以将实体模型作为字典数据返回
  • io.nop.dbtool.core.diff.OrmModelDiffer 可以获取指定 ORM 模型(app.orm.xml)间的差异
  • orm.xml 中 Entity PropId 在设计阶段可以自动按序生成, 但发版后,由于代码已打包,PropId 已固定,便不能修改, 后续针对相同模型做扩展或修改,则需要从发版模型中的最大 PropId 开始重新计算
  • 参考 io.nop.dyn.service.codegen.DynCodeGen 做代码生成
  • 通过 io.nop.orm.ddl.DdlSqlCreator 构造 SQL 脚本
  • 参考 io.nop.dyn.dao.model.DynEntityMetaToOrmModel#transformModule 将 ORM 实体模型转换为 OrmModel
    • 通过 io.nop.orm.model.loader.OrmModelLoader#loadOrmModel 可加载并合并所有 Nop 模块的 app.orm.xml
    • 导出 Excel: NopDynModuleBizModel#exportExcel
  • 通过 io.nop.biz.crud.OrmEntityCopier#copyToEntity 对 ORM 实体进行构造或更新:先构造 xmeta 再通过 OrmEntityCopier 合并
  • 通过 io.nop.dbtool.core.discovery.jdbc.JdbcMetaDiscovery#discover 实现从数据到 OrmEntityModel 的转换
  • 默认的表名、字段名大小写控制在 _vfs/nop/dao/dialect/default.dialect.xml 中以 tableNameCase="lower" columnNameCase="upper" 方式控制
  • 参考 io.nop.cli.commands.GenOrmHelper#saveOrmToExcel 做 ORM 的导出
  • io.nop.orm.initialize.DataBaseSchemaInitializer 中实现启动时自动初始化数据库, 其在 /nop/orm/beans/orm-defaults.beans.xml 通过配置开关 nop.orm.init-database-schema 控制启禁
  • 尽可能以 xpl 函数方式实现业务逻辑,以支持在设计和扩展时对函数做差量, 至于性能问题,可以在后续支持在正式发布打包时将 xpl 编译为静态 class
    • 缺点:无补全提示、调试复杂
    • 优点:类 TypeScript 语法,代码编写更自由、可对 xlib 函数做差量
  • AMIS 的 Table 组件在列上配置 filterable 时,必须设置 searchable=true 才会渲染过滤列表组件
  • AMIS 中可以通过 Service 组件动态加载 Schema 以实现复用
{
"type": "dialog",
"title": "编辑应用",
"closeOnEsc": true,
"body": {
"type": "service",
"schemaApi": "get:/pages/admin/demo/app-dev/edit-app.json"
}
}

注意事项

  • 默认不为 app.orm.xml 中的 to-one 创建外键关联,仅当为其指定了 constraint 时才会在数据库中建立外键约束,默认在 Nop ORM 层中维护关联关系
    • 外键关联仅针对 to-one 类型,to-many 属于逻辑性关联
    • 出于数据库的性能考虑,一般建议在应用侧维护数据间的关联,尽量避免使用外键约束
    • 注:目前 Nop ORM 始终不创建外键约束,索引创建也未支持
  • app.orm.xmlunique-key 未设置 constraint,则不会在数据库中创建唯一性约束
    • 将 xlib 函数 ddl:TableUniqueConstraints
  • 数据库的唯一性等约束名称需确保在同一库内是唯一的
  • 在 orm entity 上的 querySpace 属性可指定不同的数据源,从而支持多数据库连接: docs/dev-guide/orm/multi-db.md