diff --git a/EntityFramework比较.md b/EntityFramework比较.md new file mode 100644 index 0000000..5ba5fb0 --- /dev/null +++ b/EntityFramework比较.md @@ -0,0 +1,88 @@ +## 基础信息比较 + +| 功能项 | EFCore | SqlSugar | FreeSql | 说明 | +| --- | --- | --- | --- | --- | +| 出生时间 | 2015年(约) | 2014年(约) | 2018年12月 | | +| 开源协议 | Apache-2.0 | Apache-2.0 | MIT | | +| 单元测试数量 | 很多 | 无 | 5500+ | | +| github star | 9.5k+ | 3.1k+ | 2.1k+ | | +| github issues | 活跃 | 不活跃 | 活跃 | | +| 支持平台 | .NET Core | .NET Framework 4.5+、.NET Core | .Net Framework 4.0+、.NETCore | | +| 支持数据库 | 很多 | SqlServer/MySql/Sqlite/Oracle | MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/人大金仓/神舟通用/Access | | +| 生命周期 | Scoped | Scoped | Singleton | | +| 使用方式 | DbContext | SugarClient | IFreeSql、DbContext、Repository、BaseEntity、DbConnection(类似 dapper 的扩展方法) | | + +## 整体功能比较 + +| 功能项 | EFCore | SqlSugar | FreeSql | 说明 | +| --- | --- | --- | --- | --- | +| CodeFirst 根据实体类型,创建表结构 | ✔ | ✔ | ✔ | | +| CodeFirst 根据实体类型,对比表结构 | ✔ | - | ✔ | | +| CodeFirst FluentApi | ✔ | - | ✔ | | +| CodeFirst FluentApi 语法兼容 EFCore | ✔ | - | ✔ | | +| CodeFirst 实体特性兼容 EFCore | ✔ | - | ✔ | FreeSql 兼容 EFCore 的实体类特性设置 | +| CodeFirst 自定义实体特性 | - | ✔ | ✔ | | +| 导航属性(OneToOne) | ✔ | - | ✔ | | +| 导航属性(ManyToOne) | ✔ | - | ✔ | | +| 导航属性(OneToMany) | ✔ | - | ✔ | | +| 导航属性(ManyToMany) | - | - | ✔ | | +| 导航属性(Parent) | - | - | ✔ | [父子关系的实体类](https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2%e7%88%b6%e5%ad%90%e5%85%b3%e7%b3%bb) | +| 自定义表达式树解析 | - | - | ✔ | | +| 全局过滤器 | ✔ | - | ✔ | | +| 事务 | ✔ | ✔ | ✔ | | +| 读写分离 | - | ✔ | ✔ | | +| 分表分库 | - | - | ✔ | | +| 仓储 Repository | - | - | ✔ | | +| 工作单元 UnitOfWork | - | - | ✔ | | +| 工作单元管理器 UnitOfWorkManager | - | - | ✔ | 实现类似 Spring AOP 事务管理 | +| DbContext | ✔ | - | ✔ | FreeSql.DbContext 提供简单的状态管理机制 | + +## CRUD 功能比较 + +| 功能项 | EFCore | SqlSugar | FreeSql | 说明 | +| --- | --- | --- | --- | --- | +| 插入(单条) | ✔ | ✔ | ✔ | | +| 插入时,忽略/指定列 | - | ✔ | ✔ | | +| 插入时,参数化 | ✔ | ✔ | ✔ | 使用参数化生成 SQL 命令执行 | +| 插入时,无参数化 | - | - | ✔ | 不使用参数化生成 SQL 命令执行(已处理注入漏洞) | +| 插入时,获取对应的 SQL | - | ✔ | ✔ | 使用 ToSql 方法获取对应的 SQL | +| 插入时,返回影响的行数 | - | ✔ | ✔ | | +| 插入时,返回插入后的自增值 | ✔ | ✔ | ✔ | | +| 插入时,返回插入后的记录 | - | - | ✔ | SqlServer output inserted 特性、PostgreSQL returning 特性 | +| 插入时,统一审计属性值 | - | - | ✔ | 可实现统一设置实体的属性值 | +| 插入时,改变映射的表名 | - | ✔ | ✔ | | +| 插入时,Insert Ignore Into | - | - | ✔ | MySql 的功能 | +| 插入时,On Duplicate Key Update | - | - | ✔ | MySql 的功能 | +| 插入时,On Conflict Do Update | - | - | ✔ | PostgreSQL 的功能 | +| 批量插入 | - | ✔ | ✔ | [性能测试结果](https://www.cnblogs.com/kellynic/p/10557882.html) | +| 批量插入时,自动分批 | - | - | ✔ | 单次执行 SQL 允许插入的数量,超过会报错,[参考文档](https://github.com/dotnetcore/FreeSql/wiki/%E6%B7%BB%E5%8A%A0#2%E6%89%B9%E9%87%8F%E6%8F%92%E5%85%A5) | +| 批量插入时,使用BulkCopy | - | - | ✔ | | +| 更新(单条) | ✔ | ✔ | ✔ | | +| 更新时,动态条件 | - | ✔ | ✔ | 主键值、new[] { 主键值1, 主键值2 }、实体对象、new[] { 实体对象1, 实体对象2 }、new { id = 1 } | +| 更新时,传入实体对象 | - | ✔ | ✔ | 根据实体对象更新 | +| 更新时,只更新实体对象有变化的属性 | ✔ | - | ✔ | 根据状态管理更新 | +| 更新时,忽略/指定列 | - | ✔ | ✔ | +| 更新时,原子性 set num=num+1 | - | ✔ | ✔ | | +| 更新时,指定条件 | - | ✔ | ✔ | | +| 更新时,自动附加全局过滤器条件 | - | - | ✔ | | +| 更新时,不需要先查询数据 | - | ✔ | ✔ | | +| 更新时,使用乐观行锁 | ✔ | - | ✔ | | +| 更新时,使用悲观锁 | - | - | ✔ | select * from tb where id = 1 for update | +| 更新时,返回影响的行数 | - | ✔ | ✔ | | +| 更新时,返回插入后的记录 | - | - | ✔ | SqlServer output inserted 特性、PostgreSQL returning 特性 | +| 批量更新 | - | - | ✔ | | +| 删除(单条) | ✔ | ✔ | ✔ | | +| 删除时,动态条件 | - | ✔ | ✔ | 主键值、new[] { 主键值1, 主键值2 }、实体对象、new[] { 实体对象1, 实体对象2 }、new { id = 1 } | +| 删除时,指定条件 | - | ✔ | ✔ | | +| 删除时,自动附加全局过滤器条件 | - | - | ✔ | | +| 删除时,不需要先查询数据 | - | ✔ | ✔ | | +| 删除时,返回影响的行数 | - | ✔ | ✔ | | +| 删除时,返回插入后的记录 | - | - | ✔ | SqlServer output deleted 特性、PostgreSQL returning 特性 | +| 添加或更新 | - | ✔ | ✔ | | +| 添加或更新,自动适配 merge into | - | - | ✔ | [参考文档](https://github.com/dotnetcore/FreeSql/wiki/%E6%B7%BB%E5%8A%A0%E6%88%96%E4%BF%AE%E6%94%B9) | +| 批量编辑保存 | ✔ | - | ✔ | [参考文档](https://github.com/dotnetcore/FreeSql/wiki/%E6%B7%BB%E5%8A%A0%E6%88%96%E4%BF%AE%E6%94%B9#3beginedit-%E6%89%B9%E9%87%8F%E7%BC%96%E8%BE%91) | +| 查询(单条) | ✔ | ✔ | ✔ | | +| 查询时,动态条件 | - | ✔ | ✔ | 主键值、new[] { 主键值1, 主键值2 }、实体对象、new[] { 实体对象1, 实体对象2 }、new { id = 1 } | +| 查询时,动态过滤条件 | - ✔ | ✔ | [参考文档](https://github.com/dotnetcore/FreeSql/wiki/%E6%9F%A5%E8%AF%A2#%E7%89%B9%E5%88%AB%E4%BB%8B%E7%BB%8D-wheredynamicfilter) | +| 查询时,分页 | ✔ | ✔ | ✔ | | +| 查询时,分页支持 SqlServer2008 | - | ✔ | ✔ | FreeSql 自动优化:SqlServer 2012 以前的版本,使用 row_number 分页;SqlServer 2012+ 版本,使用最新的 fetch next rows 分页;| diff --git a/_Sidebar.md b/_Sidebar.md index 38fc64c..4a76681 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -49,9 +49,9 @@ ## 使用指南 -* FreeSql有什么特色功能 +* [FreeSql有什么特色功能](https://github.com/2881099/FreeSql/wiki/%E9%AA%9A%E6%93%8D%E4%BD%9C) * Dapper比较 -* EntityFramework比较 +* [EntityFramework比较](https://github.com/2881099/FreeSql/wiki/EntityFramework%e6%af%94%e8%be%83) ## 学习与交流