
飞驰 bp框架ORM 盘算推算 — 本领论述
文档版块:2026-06
章节编号:1.1
依据代码:CCFlow/Components/BP.En30(中枢 ORM 组件)
诠释:本文基于源码静态分析撰写,用于本领共享与决策论证,发愤准确姿色盘算推算想想并客不雅分析优劣。
一、缘由与盘算推揣度较
1.1 肇始于 2002 年
飞驰 ORM 盘算推算肇始于 2002 年,缘由是探索可复用的企业支配框架本领。那时需要一套约略:
斡旋姿色「数据表 ↔ 实体类」的映射关系;
在多种数据库(SQL Server、Oracle、MySQL 等)上复用归并套业务代码;
复古快速搭建照管类支配(增批改查、列表查询、主从表裁剪)。
EntityDBAccess.cs文献头防护仍保留着创建时辰标志:
/*简介:崇拜存取数据的类创建时辰:2002-10临了修改时辰:2002-10*/
1.2 盘算推揣度较(与市面 ORM 的各别点)
飞驰 ORM 从一驱动就不是「纯数据走访层」,而是面向企业低代码支配的元数据框架:
维度
飞驰 ORM 计较
典型 ORM(EF Core / Hibernate)计较
中枢对象
表 + 字段 + 控件 + 关系
类 + 属性 + 导航属性
元数据载体
Map/Attr/Attrs(代码 + 库表双轨)特色标注 / Fluent API / 商定
产出物
尊龙凯时中国官网入口CRUD + 表单 UI + 查询面板 + 主从/多对多
CRUD + LINQ 查询
运行口头
属性值存于 Row(Hashtable),弱类型读写强类型属性 + 变更追踪
这一取向决定了后续 CCFlow、JFlow、低代码表单、组织结构等模块均可在归并套元数据上叠加才调,而无用重叠界说字段语义。
二、演进历程:XML → Map / Attr / Attrs
2.1 第一阶段:XML 姿色映射(约 2002)
早期版块用 XML 文献抒发数据表与实体类的完好意思关系。Map.GenerMap(string xml)范例于今仍保留这一才调:读取 XML 中的Base、Attr、SearchAttr、Dtl、Dot2Dot等节点,动态构建Map对象。
#region 生成属性凭证xml. private string PKs = ""; public void GenerMap(string xml) { DataSet ds = new DataSet(""); ds.ReadXml(xml); foreach (DataTable dt in ds.Tables) { switch (dt.TableName) { case "Base": this.DealDT_Base(dt); break; case "Attr": this.DealDT_Attr(dt); break; case "SearchAttr": this.DealDT_SearchAttr(dt); break; case "Dtl": this.DealDT_SearchAttr(dt); break; case "Dot2Dot": this.DealDT_Dot2Dot(dt); break; default: throw new Exception("XML 竖立信息极度,莫得商定的标志:" + dt.TableName); } } // 查验竖立的完好意思性。 }
XML 决策的优点是映射与代码解耦、便于器用生成;瑕玷是调试困难、版块照管资本高、贫乏编译期查验。
2.2 第二阶段:Map / Attr / Attrs 类(约 2003)
2003 年,架构校正为以Map、Attr、Attrs三个中枢类在 C# 代码中姿色映射,成为于今沿用的主旅途。
类
责任
Map姿色一个实体(En)的完好意思元数据:物理表名、主键政策、字段蚁集、从表、多对多、查询条目、关连范例等
Attr姿色单个字段/属性:键名、物理列名、数据类型、字段逻辑类型、UI 控件、可见性、默许值、外键绑定等
AttrsAttr的蚁集,提供AddTBString、AddTBInt、AddDDLEntities、AddDDLSysEnum等工场范例,简化Map构建实体子类通过重写 EnMap属性复返我方的Map界说。以组织结构中的Emp(用户)为例:
public override Map EnMap { get { if (this._enMap != null) return this._enMap; Map map = new Map("Port_Emp", "用户"); #region 基本属性 map.EnDBUrl = new DBUrl(DBUrlType.AppCenterDSN); map.IndexField = EmpAttr.FK_Dept; #endregion #region 字段 map.AddTBStringPK(EmpAttr.No, null, "编号", true, false, 1, 50, 30); // ... map.AddTBString(EmpAttr.Name, null, "称号", true, false, 0, 200, 30); map.AddDDLEntities(EmpAttr.FK_Dept, null, "部门", new BP.Port.Depts, false); // ... #endregion 字段
代码化 Map带来了编译期类型安全(字段常量类如EmpAttr)、IDE 跳转、与业务逻辑同仓版块照管等上风,XML 旅途退居兼容与器用导入用途。
三、中枢架构
3.1 类头绪与责任

目次结构(BP.En30):
目次/文献
诠释
En/ 实体基类、 Map/Attr/Attrs、SqlBuilder、QueryObject、EntityDBAccess DA/ 数据库走访、 DBAccess、DataType、缓存 Sys/ 低代码表单位数据: MapAttr、MapData、MapDtl、SFTable、SFDBSrc Port/ 组织结构实体( Emp、Dept、Station等),均基于本 ORM 界说3.2 数据承载:Row 弱类型模子
实体字段值不成功映射为 C# 自动属性,而是存放在 Row(接管Hashtable) 中,通过GetValByKey/SetValByKey读写:
public class Row : Hashtable { // ... public void LoadAttrs(Attrs attrs) { this.Clear; foreach (Attr attr in attrs) { switch (attr.MyDataType) { case DataType.AppInt: // ...
盘算推算意图:
低代码场景下字段可运行时增删,无需从头编译实体类;
主表、从表、过程表单共用归并套读写 API;
业务类仍可封装强类型属性(如 Emp.Name),里面转调GetValStringByKey。
3.3 捏久化活水线

组件
责任
SqlBuilder 凭证 Map/Attrs生成 SELECT/INSERT/UPDATE/DELETE,处理多主键、多数据库方言 SQLCache缓存实体级 SQL 模板,减少重叠拼接
EntityDBAccess 实施 SQL、极端时触发 CheckPhysicsTable自动建表/扩列 QueryObject 链式构造 WHERE/ORDER BY,供 Entities批量查询3.4 主键政策
通过实体基类商定主键字段名:
基类
主键
典型场景
EntityNoNameNo(字符串)
部门、用户、扮装、过程编号
EntityOIDOID(自增整型)
运行实例、从标明细
EntityMyPKMyPK(组合字符串)
DeptEmp、DeptEmpStation等关连表FieldType摆设进一步区别字段逻辑扮装:平凡、主键、外键、摆设、主键+外键、关连文本、凭空字段等。
四、高出字段映射:BP 膨胀才调
原始 ORM 仅处置「数据库列 ↔ 实体属性」映射;飞驰 BP 层在此基础上膨胀为支配元数据框架。
4.1 字段逻辑类型(FieldType / FieldTypeS)
public enum FieldTypeS { Normal = 0, // 平凡属性字段 Enum = 1, // 摆设字段 FK = 2 // 外键字段 } public enum FieldType { Normal, PK, FK, Enum, PKFK, PKEnum, RefText, NormalVirtual, MultiValues }
类型
含义
典型 API
属性字段平凡列,文本框/数值/日历
AddTBString、AddTBInt、AddTBDate 摆设字段 绑定 Sys_Enum或字符串摆设AddDDLSysEnum 外键字段 绑定另一 Entities蚁集AddDDLEntities 外部数据源字段 绑定 SFTable(SQL/WS/Handler 等)UIBindKey→SFTable 关连文本 外键旁的冗余表示列(如 FK_Dept+FK_DeptT) 自动追加 key + "T"的AttrAttr.ToMapAttr与MapAttr.HisAttr组成代码 Map ↔ 库表 MapAttr双向编削桥梁,使盘算推算态(盘算推算器保存到Sys_MapAttr)与运行态(GenerMap动态生成Map)保捏一致。
4.2 控件类型映射(UIContralType)
Attr不仅记载MyDataType(存储类型),还记载UIContralType(呈现控件):
基础: TB(文本框)、DDL(下拉)、CheckBok、RadioBtn
过程/公文: HandWriting(签名)、FrmImgAth(图片附件)、GovDocFile(正文)、JobSchedule(程度图)
挪动端: MapPin、MobilePhoto、Location
低代码表单盘算推算器将控件竖立写入 Sys_MapAttr,运行时MapDtl.GenerMap遍历MapAttrs调用map.AddAttr(mapAttr.HisAttr)合成完好意思Map,从而一份元数据同期驱动捏久化与 UI 渲染。
4.3 主表—从表映射(EnDtl)
Map.AddDtl声明主实体下的从表蚁集:
public void AddDtl(Entities ens, string refKey, string groupName = null, DtlEditerModel model = DtlEditerModel.DtlBatch, string icon = null) { EnDtl dtl = new EnDtl; dtl.Ens = ens; dtl.RefKey = refKey; dtl.GroupName = this.currGroupMethodName; dtl.DtlEditerModel = model; dtl.Icon = icon; this.Dtls.Add(dtl); }
refKey:从表中外键列(如FK_Node);
DtlEditerModel
:批量裁剪、查询裁剪、自界说 URL 等模式;
过程表单明细( MapDtl)、组织结构子面板均基于此机制。
4.4 一双多 / 多对多映射(AttrOfOneVSM)
Map.AttrsOfOneVSM姿色「一」端实体与「多」端实体通过中间表(MM 表)的关连,举例用户和顺所属部门:
map.AttrsOfOneVSM.AddBranches(new DeptEmps, new BP.Port.Depts, BP.Port.DeptEmpAttr.FK_Emp, BP.Port.DeptEmpAttr.FK_Dept, "部门和顺", EmpAttr.Name, EmpAttr.No, "@WebUser.DeptNo");
支捏树形部门、平铺面板等多种和顺 UI(Dot2DotModel),成功生成部门-东谈主员和顺界面,无需手写关连 CRUD。
4.5 外部数据源(SFTable / SFDBSrc)
SFTable
:界说下拉/列表的外部数据起原(本库 SQL、跨库、WebService、Java 处理器等);
SFDBSrc:多数据源贯穿竖立,StarSky Sports2026世界杯(中国)IOS/安卓官方下载使Map可指定DBSrc指向非腹地库;
字段通过 UIBindKey关连SFTable,完竣不建物理外键列也能绑定外部数据的下拉选项。
4.6 自动 DDL(CheckPhysicsTable)
实体在 Insert/Update失败时可触发CheckPhysicsTable:按Map.Attrs界说自动创建表或膨胀列长。这使低代码「先画表单、后建表」成为可能,亦然与「迁徙剧本驱动」的 ORM 的权贵各别。
4.7 查询与权限膨胀
Map还承载:
SearchNormals/SearchFKEnums:列表页查询条目;
HisRefMethods
:实体关连功能(修改密码、部门扮装和顺等);
UAC
:插入/删除/更新/查抄权限;
AddHidden:数据领域过滤(如 SAAS 模式OrgNo = @WebUser.OrgNo)。
五、生态承载:基于 ORM 构建的产物模块
飞驰 ORM 不是伶仃的数据层,而是 CCFlow / JFlow / 飞驰 BPM 低代码平台的斡旋元数据底座。

模块
与 ORM 的关系
飞驰 BPM / CCFlow 过程模板、节点、表单均用 Entity/Entities界说;运行期表单数据通过GEEntity(通用实体)+ 动态GenerMap读写 JFlow Java 版移植归并套 Map/Attr语义,保捏跨言语元数据一致 低代码 盘算推算器操作 Sys_MapData/Sys_MapAttr;运行时合成Map;主从表、外键、摆设、外部数据源均落在Attr膨胀属性上 组织结构Port_*五表实体均在BP.Port用EnMap声明;DeptEmp、DeptEmpStation用EntityMyPK;东谈主员界面用AttrsOfOneVSM和顺多部门 权限 / 报表 / 接口 斡旋 GetValByKey读写;QueryObject构造列表;ToJsonObject输出 API论断:更换 ORM 意味慎重写元数据模子、表单盘算推算器、过程引擎数据层、组织结构集成接口——资本极高,因此该 ORM 是平台级基础范例而非可插拔组件。
六、与市面 ORM 的对比评估
6.1 对比总表
维度
飞驰 ORM(BP.En30)
Entity Framework Core
Hibernate / JPA
Dapper
定位元数据 + ORM + UI 姿色
模范 .NET ORM
Java 模范 ORM
微 ORM / SQL 映射
映射界说Map/Attr代码 +Sys_MapAttr库表特色 / Fluent API
注解 / XML
手写 SQL
查询口头QueryObject+SqlBuilderLINQ
HQL / Criteria / JPQL
原始 SQL
变更追踪无(显式 Update)
有
有(Session)
无
UI 元数据内置(控件、布局、从表)
无
无
无
主从 / 多对多EnDtl/AttrOfOneVSM一等公民导航属性竖立
关连映射
自行完竣
自动建表CheckPhysicsTableMigrations
hbm2ddl无
多数据库SqlBuilder方言分支
提供商插件
方言
取决于 SQL
低代码友好极高
低
低
低
强类型建设体验中(Row + 部分封装属性)
高
高
高
学习弧线(纯 CRUD)中(需理会 Map 体系)
中
中高
低
6.2 飞驰 ORM 的上风
元数据一体:归并Attr姿色列类型、控件、外键、摆设、默许值,盘算推算器与运行引擎零阻抗。
企业功能内建
:主从表、多对厚和顺、列表查询、权限位、关连范例,减少重叠劳动。
低代码原生:运行期可GenerMap,字段可来自数据库竖立,合适用户自界说表单。
久经分娩考证
:2002 年于今,与 CCFlow 过程场景深度耦合(附件、签名、公文、轨迹等控件类型)。
多数据库与国产库:EntityDBAccess内可见 Oracle、MySQL、PostgreSQL、达梦、东谈主大金仓瓜分支。
6.3 飞驰 ORM 的局限
非模范 ORM
:无法成功用于平凡 .NET 神色的「引包即用」,与 EF Core 生态(LINQ、迁徙、器用链)不兼容。
弱类型 Row
:大型团队纯代码建设时,枯竭编译期字段查验,重构依赖全局搜索。
无当代查询空洞:莫得 LINQ / IQueryable,复杂查询依赖SqlBuilder字符串,可读性与组合性弱于 EF。
无变更追踪:更新需显式调用Update并指定字段,易遗漏或误更新。
XML 遗产:GenerMap(xml)与代码EnMap双旅途并存,加多和讲理智包袱。
测试与 Mock:Entity与DBAccess静态耦合缜密,单位测试需依赖数据库或多半封装。
6.4 适用场景判断
场景
提议
飞驰 BPM / CCFlow / JFlow 二次建设
必须使用本 ORM,无替代
低代码表单 + 过程 + 组织结构一体部署
最合适全新 .NET 业务系统、与 BPM 无关
不保举,应选 EF Core + 孤苦 DTO
仅需高性能只读查询
可在 Entities层旁路DBAccess.RunSQL,但失去元数据收益与外部 ORM 共存
仅提议范围明晰的数据同步,幸免归并表双映射
七、典型建设模式示例
7.1 声明式实体(代码优先)
// 1. 字段常量类public class XxxAttr { public const string Title = "Title"; }// 2. 实体类public class Xxx : EntityNoName{ public override Map EnMap { get { if (_enMap != null) return _enMap; Map map = new Map("My_Xxx", "示例"); map.AddTBStringPK(XxxAttr.No, null, "编号", true, false, 1, 50, 20); map.AddTBString(XxxAttr.Title, null, "标题", true, false, 0, 200, 30); map.AddDDLSysEnum("Status", 0, "情景", true, false, "XxxStatus"); _enMap = map; return _enMap; } }}// 3. 蚁集类public class Xxxs : EntitiesNoName{ public override Entity GetNewEntity => new Xxx;}
7.2 运行时使用
Xxx en = new Xxx;en.No = "001";en.SetValByKey(XxxAttr.Title, "测试");en.Insert;Xxxs ens = new Xxxs;ens.RetrieveByAttr("Status", 1);Xxx en2 = new Xxx("001");en2.RetrieveFromDBSources;string title = en2.GetValStringByKey(XxxAttr.Title);
7.3 低代码动态表单(元数据优先)
盘算推算器保存字段 → Sys_MapAttr;
MapDtl.GenerMap/MapData.GenerMap合成Map;
GEDtl/GEEntity行为通用实体承载数据;
前端凭证 MapAttrJSON 渲染控件。
八、回来
飞驰 ORM 是一段从 2002 年 XML 映射演进到 2003 年Map/Attr/Attrs代码化元数据、并在二十余年中捏续膨胀为低代码支配框架底座的本理会线。
它的现实不是「对象—关系映射库」,而是:
用斡旋的 Map元数据,同期姿色数据库结构、实体行为、UI 控件、主从与多对多关系、外部数据源与查询条目,并驱动 CCFlow、JFlow、组织结构与低代码表单的全人命周期。
与 Entity Framework、Hibernate 等市面 ORM 比拟,飞驰 ORM 在模范性、强类型、当代查询上不占优,但在低代码、过程、表单、组织一体化场景具有弗成替代的语义内聚上风。理会这一范围,是正确使用和膨胀飞驰 BPM 平台的前提。
附录:中枢类型索引
类型
旅途
诠释
MapEn/MapExt/Map.cs实体元数据根对象
Attr/AttrsEn/MapExt/Attr.cs字段元数据与蚁集
Entity/EntitiesEn/Entity.cs、En/Entities.cs实体与蚁集基类
RowEn/Row.cs字段值容器
SqlBuilderEn/SqlBuilder.csSQL 生成
EntityDBAccessEn/EntityDBAccess.cs捏久化实施
QueryObjectEn/QueryObject.cs查询构造器
EnDtl/AttrOfOneVSMEn/EnDtl.cs、En/MapExt/AttrOfOneVSM.cs从表与多对多
MapAttrSys/MapAttr.cs低代码字段元数据(库表)
MapData/MapDtlSys/MapData.cs、Sys/MapDtl.cs表单/从表界说
SFTable/SFDBSrcSys/SFTable.cs、Sys/SFDBSrc.cs外部数据源 星空体育app2026世界杯官方下载