惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LangChain Blog
W
WeLiveSecurity
P
Proofpoint News Feed
月光博客
月光博客
NISL@THU
NISL@THU
L
LINUX DO - 最新话题
Webroot Blog
Webroot Blog
T
Threatpost
Y
Y Combinator Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Threat Research - Cisco Blogs
Vercel News
Vercel News
Jina AI
Jina AI
阮一峰的网络日志
阮一峰的网络日志
S
Schneier on Security
J
Java Code Geeks
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
小众软件
小众软件
MyScale Blog
MyScale Blog
N
News and Events Feed by Topic
Stack Overflow Blog
Stack Overflow Blog
有赞技术团队
有赞技术团队
The Hacker News
The Hacker News
Schneier on Security
Schneier on Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Help Net Security
Help Net Security
Recent Announcements
Recent Announcements
S
Security @ Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Securelist
T
The Exploit Database - CXSecurity.com
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
雷峰网
雷峰网
量子位
Google DeepMind News
Google DeepMind News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Spread Privacy
Spread Privacy
L
Lohrmann on Cybersecurity
I
Intezer
T
The Blog of Author Tim Ferriss
G
GRAHAM CLULEY
D
DataBreaches.Net
V
Vulnerabilities – Threatpost
P
Privacy & Cybersecurity Law Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
罗磊的独立博客

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第一章:SOD框架概述与设计理念
我才是银古 · 2026-06-19 · via 博客园 - 我才是银古

第一章:SOD框架概述与设计理念

1.1 SOD框架简介

1.1.1 什么是SOD框架

SOD框架(SQL-MAP、ORM、Data Controls)是一个拥有超过15年历史的国产开源企业级数据应用开发框架。它诞生于2006年,最初名为PDF.NET框架,后来发展演变为SOD框架。框架的名字来源于其三大核心功能模块的英文首字母缩写:

  • S - SQL-MAP:基于XML配置的SQL查询和数据访问层映射
  • O - ORM:对象关系映射,包含独特的OQL查询语言
  • D - Data Controls:数据窗体控件,支持WebForm/WinForm/WPF

SOD框架的设计目标是实现对数据访问细节的全方位掌控能力,它不仅仅是一个ORM框架,而是一个完整的企业级数据开发解决方案。

1.1.2 框架的发展历程

2006年 - PDF.NET框架诞生
   ↓
2008年 - 发布首个公开版本,支持.NET 2.0
   ↓
2010年 - 引入SQL-MAP技术,实现SQL语句与代码的分离
   ↓
2012年 - 发明OQL(ORM Query Language)查询语言
   ↓
2015年 - 框架重命名为SOD,开源发布
   ↓
2020年 - 支持.NET Core和.NET 5
   ↓
2024年 - 全面支持.NET 6/7/8,国产化数据库深度适配

1.1.3 框架的定位

SOD框架特别适合以下类型的企业项目:

  1. 金融行业:对数据操作安全有严格要求的项目
  2. 互联网行业:对数据访问速度、内存和CPU资源有苛刻要求的项目
  3. 快速迭代项目:需求常常变化,要求快速开发上线的项目
  4. 企业级应用:对稳定性要求高,需要长期维护的MIS、ERP、MES等系统
  5. 中小团队:预算有限的初创企业或中小型项目
  6. 国产化项目:需要支持国产数据库(人大金仓、达梦等)的项目

1.2 核心设计理念

1.2.1 简单与效率的平衡

SOD框架追求的核心目标是简单与效率的平衡,这体现在以下三个方面:

代码的精简

// 传统ADO.NET方式查询用户
string sql = "SELECT * FROM User WHERE ID=@ID";
using(var conn = new SqlConnection(connStr))
{
    conn.Open();
    using(var cmd = new SqlCommand(sql, conn))
    {
        cmd.Parameters.AddWithValue("@ID", 1);
        using(var reader = cmd.ExecuteReader())
        {
            if(reader.Read())
            {
                var user = new User();
                user.ID = reader.GetInt32(0);
                user.Name = reader.GetString(1);
                // ... 更多字段映射
            }
        }
    }
}

// SOD框架方式查询用户
User user = new User() { ID = 1 };
var result = OQL.From(user).Select().Where(user.ID).END.ToObject();

开发维护的简单

SOD框架的设计让初级程序员也能轻松看懂每一行代码,同时让资深程序员拥有"越野驾驶"般的掌控感。

追求极致的运行效率

框架在运行时尽量减少反射调用,采用动态编译和缓存技术,确保数据访问的高性能。

1.2.2 约定优于配置

SOD框架遵循"约定优于配置"的原则:

// 接口类型 IDbUser 默认映射到表 DbUser(去掉前缀I)
public interface IDbUser
{
    int ID { get; set; }
    string Name { get; set; }
}

// 动态创建实体类,无需显式配置
IDbUser user = EntityBuilder.CreateEntity<IDbUser>();

如果遵循框架的约定,可以大大简化配置和代码量。

1.2.3 动态元数据映射

与传统ORM框架使用静态特性(Attribute)进行映射不同,SOD框架采用动态元数据映射

public class UserEntity : EntityBase
{
    public UserEntity()
    {
        // 元数据在运行时定义,可动态修改
        TableName = "TbUser";           // 表名
        IdentityName = "ID";            // 标识字段
        PrimaryKeys.Add("ID");          // 主键
    }
    
    // 属性与字段的映射也是动态的
    public int ID
    {
        get { return getProperty<int>("ID"); }
        set { setProperty("ID", value); }
    }
}

这种动态性带来的优势:

  1. 分表分库支持:可以在运行时修改表名,轻松实现分表分库
  2. 虚拟主键:主键可以是逻辑上的,不必与物理主键一致
  3. 灵活的字段映射:属性名和字段名可以不同
  4. 简化配置:不依赖.NET特性声明

1.2.4 多模式数据开发

SOD框架提供三种数据开发模式,开发者可以根据场景选择最合适的模式:

SQL开发模式(SQL-MAP)

适用于:复杂SQL查询、性能敏感场景、DBA维护的SQL

<Select CommandName="GetUsers" Description="查询用户">
    <![CDATA[
    SELECT * FROM User WHERE Status=#Status:Int32#
    ]]>
</Select>

ORM开发模式(OQL)

适用于:常规CRUD操作、快速开发、类型安全的查询

var users = OQL.From(user)
    .Select()
    .Where(cmp => cmp.Property(user.Status) == 1)
    .OrderBy(user.CreateTime)
    .END
    .ToList();

窗体控件开发模式(Data Controls)

适用于:表单数据绑定、快速原型开发

// 一行代码实现表单数据收集
DataFormHelper.CollectData(user, this.Controls);
// 一行代码实现表单数据填充
DataFormHelper.FillData(user, this.Controls);

1.2.5 充血实体类模型

SOD框架采用"充血实体类"模型,实体类不仅仅是数据容器,还能追踪属性变化状态:

public class UserEntity : EntityBase
{
    public string Name
    {
        get { return getProperty<string>("Name"); }
        set { setProperty("Name", value, 50); }  // 50是字段长度
    }
}

// 使用示例
UserEntity user = new UserEntity();
user.Name = "张三";  // 此时框架记录了Name属性已被修改

// 更新时只更新修改过的字段
EntityQuery<UserEntity>.Instance.Update(user, db);
// 生成的SQL:UPDATE TbUser SET Name=@Name WHERE ID=@ID

充血实体类的优势:

  1. 精确更新:只更新修改过的字段
  2. 状态追踪:知道哪些字段被修改
  3. 自动回填:插入后自动获取自增ID

1.3 框架架构概览

1.3.1 整体架构图

┌─────────────────────────────────────────────────────────────────┐
│                        应用层 (Application Layer)                │
├─────────────────────────────────────────────────────────────────┤
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐  │
│  │  SQL-MAP     │  │    ORM/OQL   │  │   Data Controls      │  │
│  │  SQL查询映射  │  │  对象关系映射 │  │   数据窗体控件       │  │
│  └──────────────┘  └──────────────┘  └──────────────────────┘  │
├─────────────────────────────────────────────────────────────────┤
│                      核心层 (Core Layer)                         │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐  │
│  │ EntityBase   │  │ EntityQuery  │  │   EntityContainer    │  │
│  │ 实体类基类    │  │ 实体查询器   │  │   数据容器           │  │
│  └──────────────┘  └──────────────┘  └──────────────────────┘  │
├─────────────────────────────────────────────────────────────────┤
│                    数据访问层 (Data Access Layer)                 │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │                     AdoHelper                             │  │
│  │            抽象数据访问辅助类(数据库无关)                   │  │
│  └──────────────────────────────────────────────────────────┘  │
├─────────────────────────────────────────────────────────────────┤
│                   数据提供程序 (Data Providers)                   │
│  ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────────┐   │
│  │SqlServer│ │ MySQL  │ │ Oracle │ │SQLite  │ │达梦/金仓...│   │
│  └────────┘ └────────┘ └────────┘ └────────┘ └────────────┘   │
└─────────────────────────────────────────────────────────────────┘

1.3.2 核心程序集

程序集 说明
PWMIS.Core 框架核心类库,包含所有核心功能
PWMIS.Core.Extensions 框架扩展方法和GOQL支持
PWMIS.Windows Windows窗体数据控件
PWMIS.Web Web窗体数据控件

1.3.3 主要命名空间

PWMIS.DataMap.Entity     // 实体类相关
PWMIS.DataMap.SqlMap     // SQL-MAP相关
PWMIS.DataProvider.Data  // 数据提供程序
PWMIS.Common             // 公共工具类
PWMIS.Core               // 核心扩展

1.4 与其他ORM框架的对比

1.4.1 SOD vs Entity Framework

特性 SOD Entity Framework
学习曲线 较高
运行时性能 中等
批量更新 简单直接 复杂
SQL控制 完全可控 有限
动态映射 支持 不支持
分表分库 内置支持 需要扩展
.NET版本 2.0起 3.5起
国产数据库 良好支持 有限

1.4.2 SOD vs Dapper

特性 SOD Dapper
ORM功能 完整 基础
查询语言 OQL 纯SQL
实体状态追踪 支持 不支持
Code First 支持 不支持
数据窗体 支持 不支持
企业级解决方案 丰富

1.4.3 SOD vs NHibernate

特性 SOD NHibernate
配置复杂度
性能 中等
动态性
中文文档 丰富 较少
社区活跃度

1.5 框架的核心优势

1.5.1 安全性

SOD框架将数据访问安全作为最重要的目标:

  1. 全面的参数化查询:所有数据库都支持参数化查询,防止SQL注入
  2. 抽象SQL参数:统一的参数语法,屏蔽不同数据库的差异
  3. 查询日志:完整记录SQL执行过程,便于审计

1.5.2 灵活性

  1. 多种开发模式:SQL-MAP、ORM、Data Controls
  2. 动态映射:运行时可修改元数据
  3. 多数据库支持:一套代码适配多种数据库

1.5.3 高性能

  1. 精确SQL生成:只查询/更新需要的字段
  2. 缓存机制:支持热缓存
  3. 命令管道:批量操作优化
  4. 微型ORM模式:直接操作DataReader

1.5.4 易用性

  1. 简单API:几乎没有学习成本
  2. 链式语法:OQL的链式调用
  3. 约定优于配置:减少配置工作
  4. 集成开发工具:实体类生成器、SQL-MAP代码生成器

1.6 适用场景与技术选型建议

1.6.1 推荐使用SOD的场景

✅ 需要同时支持多种数据库的项目
✅ 对SQL有精细控制需求的项目
✅ 需要快速开发的中小型项目
✅ 需要支持国产数据库的项目
✅ 团队.NET技能参差不齐的项目
✅ 需要长期维护的企业级系统

1.6.2 可能不适合的场景

⚠️ 已经深度使用EF的大型遗留系统
⚠️ 纯微服务架构且查询极其简单的项目
⚠️ 需要完整EF生态系统支持的项目

1.6.3 技术选型建议

项目类型判断
    │
    ├── 简单查询、性能极致 → Dapper
    │
    ├── 复杂ORM、生态需求 → Entity Framework
    │
    ├── 多数据库、精细控制、快速开发 → SOD
    │
    └── 企业级、国产化、全功能 → SOD

1.7 本章小结

SOD框架是一个历经15年实战检验的国产开源数据开发框架,它的设计理念体现了对简单性和效率的平衡追求。通过SQL-MAP、ORM和Data Controls三大核心功能,SOD为开发者提供了全方位的数据开发解决方案。

框架的核心优势包括:

  • 动态元数据映射,灵活适应各种场景
  • 多种开发模式,满足不同需求
  • 充血实体类,精确控制数据操作
  • 优秀的安全性和性能
  • 良好的国产化支持

在接下来的章节中,我们将深入学习SOD框架的各个组成部分,掌握框架的使用方法和最佳实践。


下一章预告:第二章将详细介绍SOD框架的架构设计和核心组件,深入理解AdoHelper、EntityBase、OQL等核心类的实现原理。