一、主流的八款 ORM 速览
| EF Core | ||||
| Dapper | ||||
| SqlSugar | ||||
| FreeSql | ||||
以上为 2025~2026 年活跃维护的版本,NHibernate 虽老但在部分遗留项目中仍在用。
二、按核心维度横向拆开看
1. 性能:谁的 SQL 跑得快
工厂表动辄千万行,联表三四张,存储过程一大把。查询性能是硬指标。
| Dapper | |||||
| RepoDB | |||||
| Linq2DB | |||||
关键结论:Dapper 的简单查询比 EF Core 快 3~5 倍。但如果你的业务不追求极致性能,EF Core 的差距在现代硬件上几乎可以忽略。真正拉开差距的场景是批量操作——批量插入 10 万行,EF Core 逐条 SaveChanges 能跑好几分钟,FreeSql 和 SqlSugar 的 BulkInsert 秒级完成。
2. 开发效率:谁的开发体验更好
你一个人既要写后端又要写 SQL,开发效率是不能忽视的成本。
| EF Core | ||||
| SqlSugar | ||||
| FreeSql | ||||
你习惯 SQL Server + DDD,EF Core 的 Code First + Migration 在工厂项目里是好搭档——建表改表省掉大量手写 DDL。但如果你偏爱直接写 SQL,SqlSugar 和 FreeSql 的 LINQ 体验更接近 SQL 思维,不像 EF Core 有时会翻译出意外的东西。
3. SQL 控制力:
工厂信息化最绕不开的就是复杂报表、多表联查、存储过程。ORM 如果在这方面限制你,那就是给自己找麻烦。
| Dapper | |||||
| SqlSugar | |||||
| FreeSql | |||||
| RepoDB | |||||
如果你习惯直接写 SQL 调优,Dapper 或 SqlSugar 更顺手。EF Core 的 LINQ 翻译有时不是你想要的 SQL,GroupBy + 复杂聚合的翻译尤其容易出问题,调优需要绕路。
三、工厂信息化四大场景的选型建议
场景一:MES / WMS 核心业务系统
推荐:EF Core + Dapper 混搭
日常 CRUD 用 EF Core(开发快、迁移方便);复杂报表 / 看板查询用 Dapper(SQL 可控、性能好)。你已有 SQL Server 2022,EF Core 8/9 对其支持非常成熟。
// 典型的混搭模式 public class ProductionOrderRepository { private readonly AppDbContext _db; private readonly IDbConnection _conn; // 简单 CRUD 走 EF Core public async Task<Order?> GetById(int id) => await _db.Orders.FindAsync(id); // 复杂报表走 Dapper public async Task<List<DailyOutput>> GetDailyReport(DateTime date) { var sql = @" SELECT LineCode, SUM(Qty) AS TotalQty, AVG(CycleTime) AS AvgCycle FROM ProductionRecords WHERE WorkDate = @date GROUP BY LineCode"; return (await _conn.QueryAsync<DailyOutput>( sql, new { date })).ToList(); } }
场景二:报表 / 看板 / 数据中台
推荐:Dapper 或 FreeSql
几乎全是手写 SQL 的复杂查询。FreeSql 的批量插入/更新比 EF Core 快得多,不需要 Migration、不需要变更追踪,轻装上阵。
场景三:对接金蝶云星空 / 第三方系统
推荐:SqlSugar
跨数据库支持好(MySql / SQLite / Oracle 都行),国产框架,对接国内 ERP 厂商踩坑少。SqlSugar 的 ISugarQueryable 写复杂 LINQ 比 EF 更接近 SQL 思维。
场景四:小工具 / 后台服务 / 命令行
推荐:PetaPoco 或 Dapper(Dapper.Contrib)
一个文件搞定,不依赖 DI 容器,启动快、内存少,非常适合 Windows Service 或定时任务。
四、避坑指南:
以下都是我在工作中实际遇到过的坑:
| N+1 查询 | ||
| 追踪开销 | .AsNoTracking(),不然 DbContext 越撑越大。 | |
| LINQ 翻译陷阱 | FromSqlRaw。 | |
| 批量操作慢 | ||
| SQL 注入 | ||
| Migration 冲突 | ||
| 连接泄漏 | ||
| 仓储过度抽象 |
五、最终的选型建议
如果是你是做.NET的,我最直接的推荐是:主用 EF Core 8+,关键查询用 Dapper 兜底。
理由很清楚:
1. EF Core 的 Code First + Migration 让你不用手写建表脚本;
2. DDD 的聚合根、仓储模式在 EF Core 下天然契合;
3. SQL Server 的 JSON 列、全文索引等高阶特性,EF Core 8/9 都完整支持;
4. Dapper 作为补充,复杂报表不被 ORM 生成的 SQL 拖累;
5. 两个框架跟 SQL Server 的适配是 .NET 生态里最成熟的。