实现
版权声明
- 文章作者: flytreeleft - flytreeleft@crazydan.org
- 文章链接: https://duzhou.crazydan.io/docs/development/framework/server/app-modeler/tech
- 版权声明: 本文章采用许可协议《署名 4.0 国际 (CC BY 4.0)》。 转载或商用请注明来自渡舟平台!
备忘
- 在需要通过被关联对象的某个属性查询时,可以定义别名并映射到目标属性上,
然后,在 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.xml
对unique-key
未设置constraint
,则不会在数据库中创建唯一性约束- 将 xlib 函数
ddl:TableUniqueConstraints
- 将 xlib 函数
- 数据库的唯一性等约束名称需确保在同一库内是唯一的
- 在 orm entity 上的
querySpace
属性可指定不同的数据源,从而支持多数据库连接:docs/dev-guide/orm/multi-db.md