写在开头
2018年11月的某一天,头脑发热开启了 FreeSql 开源项目之旅,时间一晃已经四年多,当初从舒服区走向一个巨大的坑,回头一看后背一凉。四年时间从无到有,经历了数不清的日夜奋战(有人问我花了多长时间投入,答案:全职x2 + 前两年无休息,以及后面两年的持续投入)。今天 FreeSql 已经很强大,感谢第一期、第二期、第N期持续提出建议的网友。
FreeSql 现如今已经是一个稳定的版本,主要体现:
- API 已经确定,不会轻易推翻重作调整,坚持十年不变的原则,让使用者真真正正的不再关心 ORM 使用问题;
- 单元测试覆盖面广,6336+ 个单元测试,小版本更新升级无须考虑修东墙、补西墙的问题;
- 经历四年时间的生产考验,nuget下载量已超过900K+,平均每日750+;
感叹:有些人说 .Net 陷入 orm 怪圈,动手的没几个,指点江山的一堆,.Net orm 真的如他们所讲的简单吗?
项目介绍
FreeSql 是 .Net ORM,能支持 .NetFramework4.0+、.NetCore、Xamarin、MAUI、Blazor、以及还有说不出来的运行平台,因为代码绿色无依赖,支持新平台非常简单。目前单元测试数量:6336+,Nuget下载数量:900K+。QQ群:4336577(已满)、8578575(在线)、52508226(在线)
温馨提醒:以下内容无商吹成份,FreeSql 不打诳语
为什么要重复造轮子?
FreeSql 主要优势在于易用性上,基本是开箱即用,在不同数据库之间切换兼容性比较好。作者花了大量的时间精力在这个项目,肯请您花半小时了解下项目,谢谢。FreeSql 整体的功能特性如下:
- 支持 CodeFirst 对比结构变化迁移;
- 支持 DbFirst 从数据库导入实体类;
- 支持 丰富的表达式函数,自定义解析;
- 支持 批量添加、批量更新、BulkCopy;
- 支持 导航属性,贪婪加载、延时加载、级联保存;
- 支持 读写分离、分表分库,租户设计;
- 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/神通/人大金仓/翰高/MsAccess Ado.net 实现包,以及 Odbc 的专门实现包;
5500+个单元测试作为基调,支持10多数数据库,我们提供了通用Odbc理论上支持所有数据库,目前已知有群友使用 FreeSql 操作华为高斯、mycat、tidb 等数据库。安装时只需要选择对应的数据库实现包:
dotnet add packages FreeSql.Provider.MySql
FreeSql.Repository 是 FreeSql 项目的延申扩展类库,支持 .NETFramework4.0+、.NETCore2.0+、.NET5+、Xamarin 平台。
FreeSql.Repository 除了 CRUD 还有很多实用性功能,不防耐下心花10分钟看完。
01 安装
环境1:.NET Core 或 .NET 5.0+
dotnet add package FreeSql.Repository
环境2、.NET Framework
Install-Package FreeSql.DbContext
static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, connectionString)
.UseAutoSyncStructure(true) //自动迁移实体的结构到数据库
.Build(); //请务必定义成 Singleton 单例模式
02 使用方法
方法1、IFreeSql 的扩展方法;
var curd = fsql.GetRepository<Topic>();
注意:Repository 对象多线程不安全,因此不应在多个线程上同时对其执行工作。
- fsql.GetRepository 方法返回新仓储实例
- 不支持从不同的线程同时使用同一仓储实例
以下为了方便测试代码演示,我们都使用方法1,fsql.GetRepository 创建新仓储实例
方法2、继承实现;
public class TopicRepository: BaseRepository<Topic, int> {
public TopicRepository(IFreeSql fsql) : base(fsql, null, null) {
}
//在这里增加 CURD 以外的方法
}
方法3、依赖注入;
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IFreeSql>(Fsql);
services.AddFreeRepository(null, this.GetType().Assembly);
}
//在控制器使用
public TopicController(IBaseRepository<Topic> repo) {
}
03 添加数据
repo.Insert 插入数据,适配了各数据库优化执行 ExecuteAffrows/ExecuteIdentity/ExecuteInserted
1、如果表有自增列,插入数据后应该要返回 id。
var repo = fsql.GetRepository<Topic>();
repo.Insert(topic);
内部会将插入后的自增值填充给 topic.Id
2、批量插入
var re