























SOD框架(SQL-MAP、ORM、Data Controls)是一个拥有超过15年历史的国产开源企业级数据应用开发框架。它诞生于2006年,最初名为PDF.NET框架,后来发展演变为SOD框架。框架的名字来源于其三大核心功能模块的英文首字母缩写:
SOD框架的设计目标是实现对数据访问细节的全方位掌控能力,它不仅仅是一个ORM框架,而是一个完整的企业级数据开发解决方案。
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,国产化数据库深度适配
SOD框架特别适合以下类型的企业项目:
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框架的设计让初级程序员也能轻松看懂每一行代码,同时让资深程序员拥有"越野驾驶"般的掌控感。
框架在运行时尽量减少反射调用,采用动态编译和缓存技术,确保数据访问的高性能。
SOD框架遵循"约定优于配置"的原则:
// 接口类型 IDbUser 默认映射到表 DbUser(去掉前缀I)
public interface IDbUser
{
int ID { get; set; }
string Name { get; set; }
}
// 动态创建实体类,无需显式配置
IDbUser user = EntityBuilder.CreateEntity<IDbUser>();
如果遵循框架的约定,可以大大简化配置和代码量。
与传统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); }
}
}
这种动态性带来的优势:
SOD框架提供三种数据开发模式,开发者可以根据场景选择最合适的模式:
适用于:复杂SQL查询、性能敏感场景、DBA维护的SQL
<Select CommandName="GetUsers" Description="查询用户">
<![CDATA[
SELECT * FROM User WHERE Status=#Status:Int32#
]]>
</Select>
适用于:常规CRUD操作、快速开发、类型安全的查询
var users = OQL.From(user)
.Select()
.Where(cmp => cmp.Property(user.Status) == 1)
.OrderBy(user.CreateTime)
.END
.ToList();
适用于:表单数据绑定、快速原型开发
// 一行代码实现表单数据收集
DataFormHelper.CollectData(user, this.Controls);
// 一行代码实现表单数据填充
DataFormHelper.FillData(user, this.Controls);
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
充血实体类的优势:
┌─────────────────────────────────────────────────────────────────┐
│ 应用层 (Application Layer) │
├─────────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ SQL-MAP │ │ ORM/OQL │ │ Data Controls │ │
│ │ SQL查询映射 │ │ 对象关系映射 │ │ 数据窗体控件 │ │
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ 核心层 (Core Layer) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ EntityBase │ │ EntityQuery │ │ EntityContainer │ │
│ │ 实体类基类 │ │ 实体查询器 │ │ 数据容器 │ │
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ 数据访问层 (Data Access Layer) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ AdoHelper │ │
│ │ 抽象数据访问辅助类(数据库无关) │ │
│ └──────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ 数据提供程序 (Data Providers) │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────────┐ │
│ │SqlServer│ │ MySQL │ │ Oracle │ │SQLite │ │达梦/金仓...│ │
│ └────────┘ └────────┘ └────────┘ └────────┘ └────────────┘ │
└─────────────────────────────────────────────────────────────────┘
| 程序集 | 说明 |
|---|---|
| PWMIS.Core | 框架核心类库,包含所有核心功能 |
| PWMIS.Core.Extensions | 框架扩展方法和GOQL支持 |
| PWMIS.Windows | Windows窗体数据控件 |
| PWMIS.Web | Web窗体数据控件 |
PWMIS.DataMap.Entity // 实体类相关
PWMIS.DataMap.SqlMap // SQL-MAP相关
PWMIS.DataProvider.Data // 数据提供程序
PWMIS.Common // 公共工具类
PWMIS.Core // 核心扩展
| 特性 | SOD | Entity Framework |
|---|---|---|
| 学习曲线 | 低 | 较高 |
| 运行时性能 | 高 | 中等 |
| 批量更新 | 简单直接 | 复杂 |
| SQL控制 | 完全可控 | 有限 |
| 动态映射 | 支持 | 不支持 |
| 分表分库 | 内置支持 | 需要扩展 |
| .NET版本 | 2.0起 | 3.5起 |
| 国产数据库 | 良好支持 | 有限 |
| 特性 | SOD | Dapper |
|---|---|---|
| ORM功能 | 完整 | 基础 |
| 查询语言 | OQL | 纯SQL |
| 实体状态追踪 | 支持 | 不支持 |
| Code First | 支持 | 不支持 |
| 数据窗体 | 支持 | 不支持 |
| 企业级解决方案 | 丰富 | 无 |
| 特性 | SOD | NHibernate |
|---|---|---|
| 配置复杂度 | 低 | 高 |
| 性能 | 高 | 中等 |
| 动态性 | 强 | 弱 |
| 中文文档 | 丰富 | 较少 |
| 社区活跃度 | 中 | 中 |
SOD框架将数据访问安全作为最重要的目标:
✅ 需要同时支持多种数据库的项目
✅ 对SQL有精细控制需求的项目
✅ 需要快速开发的中小型项目
✅ 需要支持国产数据库的项目
✅ 团队.NET技能参差不齐的项目
✅ 需要长期维护的企业级系统
⚠️ 已经深度使用EF的大型遗留系统
⚠️ 纯微服务架构且查询极其简单的项目
⚠️ 需要完整EF生态系统支持的项目
项目类型判断
│
├── 简单查询、性能极致 → Dapper
│
├── 复杂ORM、生态需求 → Entity Framework
│
├── 多数据库、精细控制、快速开发 → SOD
│
└── 企业级、国产化、全功能 → SOD
SOD框架是一个历经15年实战检验的国产开源数据开发框架,它的设计理念体现了对简单性和效率的平衡追求。通过SQL-MAP、ORM和Data Controls三大核心功能,SOD为开发者提供了全方位的数据开发解决方案。
框架的核心优势包括:
在接下来的章节中,我们将深入学习SOD框架的各个组成部分,掌握框架的使用方法和最佳实践。
下一章预告:第二章将详细介绍SOD框架的架构设计和核心组件,深入理解AdoHelper、EntityBase、OQL等核心类的实现原理。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。