.Net orm 开源项目 FreeSql 2.0.0

写在开头

2018年11月头脑发热到今天,一晃已经两年,当初从舒服区走向一个巨大的坑,回头一看后背一凉。

两年时间从无到有,经历数不清的日夜奋斗(有人问花了多长时间投入,答案:全职x2 + 两年无休息)。

今天 FreeSql 已经很强大,感谢第一批、第二批、第N批持续提出建议的朋友,总算给社区交了一个满意答卷。

v2.0.0 是一个稳定的版本,主要体现:

  • 用户 API 已经确定,不会轻易推翻又作调整,坚持五年不变的原则,让使用者真真正正的不再关心 ORM 使用问题;

  • 单元测试覆盖面广,5500+个单元测试,小版本更新升级无须考虑修东墙、补西墙的问题;

  • 经历两年时间的生产考验,nuget下载量已超过25万,平均每日350+;

感叹:有些人说 .Net 陷入 orm 怪圈,动手的没几个,指点江山的一堆,.Net orm 真的如他们所讲的简单吗?

项目简介

温馨提醒:以下内容无商吹成份,FreeSql 不打诳语

温馨提醒:以下内容无商吹成份,FreeSql 不打诳语

温馨提醒:以下内容无商吹成份,FreeSql 不打诳语

FreeSql 是 .Net ORM,能支持 .NetFramework4.0+、.NetCore、Xamarin、MAUI、Blazor、以及还有说不出来的运行平台,因为代码绿色无依赖,支持新平台非常简单。目前单元测试数量:5400+,Nuget下载数量:260K+,源码几乎每天都有提交。值得高兴的是 FreeSql 加入了 ncc 开源社区:https://github.com/dotnetcore/FreeSql,加入组织之后社区责任感更大,需要更努力做好品质,为开源社区出一份力。

QQ群:4336577(已满)、8578575(在线)、52508226(在线)

为什么要重复造轮子?

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

CodeFirst

FreeSql 使用 CodeFirst 模式开发,简直不要再简单,只需要如下定义:

static IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, @"Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd_mysqlconnector;Charset=utf8;SslMode=none;Max pool size=10").UseAutoSyncStructure(true) //自动同步实体结构到数据库.UseMonitorCommand(cmd => Console.WriteLine(cmd.CommandText + "\r\n")) //打印 SQL.Build(); //请务必定义成 Singleton 单例模式

UseAutoSyncStructure(true) 这个设置开启自动迁移功能,啥意思?如下实体类:

class Blog {[Column(IsIdentity = true, IsPrimary = true)]public int BlogId { get; set; }public string Url { get; set; }public int Rating { get; set; }
}

fsql 对 Blog 进行 CRUD 时,比如:

fsql.Select<Blog>().First();
fsql.Select<Blog>().First();

会执行 SQL 如下:

CREATE TABLE IF NOT EXISTS `cccddd_mysqlconnector`.`Blog` (  `BlogId` INT(11) AUTO_INCREMENT, `Url` VARCHAR(255), `Rating` INT(11) NOT NULL, PRIMARY KEY (`BlogId`)
) Engine=InnoDB;SELECT a.`BlogId`, a.`Url`, a.`Rating` 
FROM `Blog` a 
limit 0,1SELECT a.`BlogId`, a.`Url`, a.`Rating` 
FROM `Blog` a 
limit 0,1

程序运行过程中,首次 CRUD 操作实体类会创建表,之后不再执行该操作。

这是表不存在的情况,如果表存在的时候会怎样?会对比更新结构。FreeSql 对比表结构和实体类的差异部分,执行迁移尽量保证不丢数据(无法100%保证,请三思使用在生产环境)

除了自动迁移功能,我们还提供以几个常用 API fsql.CodeFirst 方法:

方法返回值参数说明
GetComparisonDDLStatementsstringType将实体类型与数据库对比,返回DDL语句
SyncStructureboolType同步实体类型到数据库
ConfigEntityICodeFirstAction<TableFluent<T>>FluentAPI 配置实体的特性
GetTableByEntityTableInfoType获取类型在ORM内部的元数据

实体特性

.NET ORM 几乎都是通过实体与表进行映射,怎么少得了灵活的特性设置呢。

提示:FreeSql 可以自动识别 EFCore 实体特性 Key/Required/NotMapped/MaxLength/StringLength/DatabaseGenerated/Table/Column

[Table(Name = "topic")]
class Topic {[Column(IsPrimary = true, IsIdentity = true, Name = "id")]public int Id { get; set; }
}

如上 Name 设置实体类与数据库小写映射,其实还提供统一处理的方法:

static IFreeSql fsql = new FreeSql.FreeSqlBuilder()//..UseNameConvert(NameConvertType.ToLower)//...Build();// PascalCaseToUnderscore: BigApple -> Big_Apple
// PascalCaseToUnderscoreWithUpper: BigApple -> BIG_APPLE
// PascalCaseToUnderscoreWithLower: BigApple -> big_apple
// ToUpper: BigApple -> BIGAPPLE
// ToLower: BigApple -> bigapple
// 感谢【晓晨】提供的这个思路和功能

CRUD

FreeSql CRUD 命名习惯遵从 SQL,代码写起来就像写 SQL 一样,如下:

  • 插入数据:fsql.Insert(item).ExecuteAffrows();

  • 更新数据:fsql.Update<T>().Where(..).Set(..).ExecuteAffrows();

  • 删除数据:fsql.Delete<T>().Where(..).ExecuteAffrows();

  • 查询数据:fsql.Select<T>().Where(..).ToList();

Repository

FreeSql.Repository 作为扩展,实现了通用仓储层功能。与其他规范标准一样,仓储层也有相应的规范定义。FreeSql.Repository 参考 abp vnext 接口,定义和实现基础的仓储层(CURD),应该算比较通用的方法吧。仓储可以:

  • Select/Attach 快照对象,Update 只更新变化的字段;

  • Insert 插入数据,适配各数据库优化执行 ExecuteAffrows/ExecuteIdentity/ExecuteInserted;

  • InsertOrUpdate 插入或更新;

  • SaveMany 方法快速保存导航对象(一对多、多对多);

  • UnitOfWork 工作单元设置;

导航属性

微软制造了优秀的语言 c#,利用语言特性可以做一些非常好用的功能,在 ORM 中使用导航属性非常适合。

  • FreeSql ManyToOne(N对1) 提供了简单的多表 join 查询;

  • FreeSql OneToMany(1对N) 提供了简单可控的级联查询、级联保存功能;

  • FreeSql ManyToMany(多对多) 提供了简单的多对多过滤查询、级联查询、级联保存功能;

  • FreeSql 父子关系 提供了常用的 CTE查询、删除、递归功能;

关于导航属性,我们写了一篇专门介绍的文章,可跳转查看:.NET ORM 导航属性【到底】可以解决什么问题?

分表分库

关于分表分库,我们写了一篇专门介绍的文章,可跳转查看:.NET ORM 分表分库【到底】怎么做?

事务

关于事务,我们写了一篇专门介绍的文章,可跳转查看:.NET 数据库事务的各种玩法进化

写在最后

FreeSql 2.0.0 他是免费自由的 ORM,也可以说是宝藏 ORM。更多文档请前往 wiki 查看。

下一个五年,期待少年的你还能归来在此贴回复,兑现五年不变的承诺。

多的不说了,希望民间的开源力量越来越强大。

希望作者的努力能打动到你,请求正在使用的、善良的您能动一动小手指,把文章转发一下,让更多人知道 .NET 有这样一个好用的 ORM 存在。谢谢!!

FreeSql 使用最宽松的开源协议 MIT https://github.com/dotnetcore/FreeSql,完全可以商用,文档齐全。QQ群:4336577(已满)、8578575(在线)、52508226(在线)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言函数库——ispunct函数 判断字符是否为标点符号或特殊字符

c语言函数库——ispunct函数 判断字符是否为标点符号或特殊字符 头文件&#xff1a;#inlude <ctype.h> spunct() 函数用来检测一个字符是否为标点符号或特殊字符&#xff0c;其原型为&#xff1a; int ispunct(int c); 【参数】c 为需要检测的字符。 【返回值】若 c 为标…

js重新渲染div_前端工程师必备:从浏览器的渲染到性能优化

文章来自&#xff1a;华为云开发者社区摘要&#xff1a;本文主要讲谈及浏览器的渲染原理、流程以及相关的性能问题。问题前瞻1. 为什么css需要放在头部&#xff1f;2. js为什么要放在body后面&#xff1f;3. 图片的加载和渲染会阻塞页面DOM构建吗&#xff1f;4. dom解析完才出现…

做架构也得讲武德

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「169」篇原创敬上大家好&#xff0c;我是Z哥。今天分享一篇对「架构」这件事的随想。我想&#xff0c;做「架构」是每个热爱技术的技术人在不断追求想进入的领域。…

c++随机数函数rand()

c 语言rand()生成随机数 c语言中rand()函数生成随机数的用法&#xff1a; 详细介绍&#xff1a; (1)使用该函数首先应在开头包含头文件stdlib.h #include<stdlib.h>(C建议使用#include&#xff0c;下同) (2)在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数…

杂牌手柄模拟xboxone手柄_手机就能玩Switch游戏,蛋蛋模拟器+盖世小鸡X2手柄体验...

最近收到一个很爆炸的消息&#xff0c;国外大神开发出了EGG模拟器(蛋蛋模拟器)&#xff0c;让手机也能玩Switch游戏&#xff0c;一直垂涎Switch游戏体验的我怎么能错过呢&#xff0c;必须一探究竟。据悉&#xff0c;EGG模拟器支持100多款Switch游戏&#xff0c;而且游戏还在持续…

api-hook,更轻量的接口测试工具

前言在网站的开发过程中&#xff0c;接口联调和测试是至关重要的一环&#xff0c;其直接影响产品的核心价值&#xff0c;而目前也有许多技术方案和工具加持&#xff0c;让我们的开发测试工作更加便捷。接口作为数据传输的重要载体&#xff0c;数据格式和内容具有多样性&#xf…

C++11的for循环使用auto的新用法

C11的for循环使用auto的新用法 for(auto a:vec) { cout<<a<<" "; } #include<bits/stdc.h> using namespace std; int main() {vector<int> vec;for(int i0; i<10; i){vec.push_back(i);}for(auto a:vec){cout<<a<<" …

如何使用 C# 中的 HashSet

译文链接&#xff1a;https://www.infoworld.com/article/3586972/how-to-use-hashset-in-csharp.htmlHashSet 是一个优化过的无序集合&#xff0c;提供对元素的高速查找和高性能的set集合操作&#xff0c;而且 HashSet 是在 .NET 3.5 中被引入的&#xff0c;在 System.Collect…

python装饰器源代码_13-Python-装饰器

1、装饰器的定义 装饰器的本质就是函数&#xff0c;用来装饰其它函数&#xff0c;就是为其它函数添加附加功能。 装饰器原则如下&#xff1a; 不能修改被装饰的函数的源代码 不能修改被装饰的函数的调用方式 2、实现装饰器知识储备 函数即变量 1 defbar():2 print("in the…

算法设计与分析——分治与递归策略——hanoi问题

**汉诺塔问题&#xff1a;**古代有一个梵塔&#xff0c;塔内有三个座A、B、C&#xff0c;A座上有64个盘子&#xff0c;盘子大小不等&#xff0c;大的在下&#xff0c;小的在上&#xff08;如图&#xff09;。有一个和尚想把这64个盘子从A座移到B座&#xff0c;但每次只能允许移…

post多个参数_关于HTTP GET和POST的区别

Photo by Luca Bravo on UnsplashGET还是POST&#xff1f; 考虑将浏览器作为客户端&#xff0c;可以缓存哪种方法&#xff1f; 哪个是"安全"方法&#xff1f; 哪一个不是幂等的&#xff1f; 如果我将端点URL复制并粘贴到浏览器的地址栏中&#xff0c;然后按Enter&…

小试YARP

.net core下&#xff0c;一个轻量组反向代理库&#xff0c;由微软发起。做了一个简单的带验证的反向代理&#xff0c;应用结构如上图&#xff0c;一个验证服务&#xff0c;两个业务服务和一个YARP服务。源码https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/As…

Entity Framework Core 5中实现批量更新、删除

本文介绍了一个在EntityFramework Core 5中不需要预先加载数据而使用一句SQL语句批量更新、删除数据的开发包&#xff0c;并且分析了其实现原理&#xff0c;并且与其他实现方案做了比较。一、背景随着微软全面拥抱开源&#xff0c;.Net开源社区百花开放&#xff0c;涌现了非常多…

篮子里拿鸡蛋问题

一个一个拿&#xff0c;正好拿完。两个两个拿&#xff0c;还剩一个。三个三个拿&#xff0c;正好拿完。 四个四个拿&#xff0c;还剩一个。五个五个拿&#xff0c;还差一个。六个六个拿&#xff0c;还剩三个。 七个七个拿&#xff0c;正好拿完。八个八个拿&#xff0c;还剩一个…

一套标准的ASP.NET Core容器化应用日志收集分析方案

点击上方蓝字给一个关注吧讲故事关注我公众号的朋友&#xff0c;应该知道我写了一些云原生应用日志收集和分析相关的文章&#xff0c;其中内容大多聚焦某个具体的组件&#xff1a;超级有用的TraceId&#xff0c;快点用起来吧&#xff01;如何利用NLog输出结构化日志&#xff0c…

算法设计与分析——递归与分治策略——棋盘覆盖

问题描述 棋盘覆盖问题要求在2^k * 2^k 个方格组成的棋盘中&#xff0c;你给定任意一个特殊点&#xff0c;用一种方案实现对除该特殊点的棋盘实现全覆盖。 建立模型如图&#xff1a; 解决方案就是利用分治法&#xff0c;将方形棋盘分成4部分&#xff0c;如果该特殊点在某一部…

函数求值需要运行所有线程_JavaScript函数式编程(二)

纯函数就是&#xff0c;对于相同的输入&#xff0c;永远会得到相同的输出&#xff0c;而且没有任何可观察的副作用&#xff0c;也不依赖外部环境的状态但是实际的编程中&#xff0c;特别是前端的编程范畴里&#xff0c;“不依赖外部环境”这个条件是根本不可能的&#xff0c;我…

算法设计与分析——递归与分治——归并排序

归并排序采用的是一种分治的思想&#xff0c;如下图&#xff0c;先将要排序的元素分为两块&#xff0c;每个块又开始分裂&#xff0c;然后逐个按照特定顺序合并&#xff0c;合成最后我们需要的数组。 归并排序的复杂度&#xff1a; 时间复杂度&#xff1a;O(nlogn) 空间复杂度&…

git 回退上一个版本_Git小白使用教程:详细、显现、真正手把手教!

不少小伙伴私信问我GitHub怎么使用&#xff1f;今天更一下&#xff0c;希望能帮到你&#xff0c;有问题评论区拍砖交流吧。

在传统行业做数字化转型之业务篇

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第307篇原创内容在过去的两年时间里&#xff0c;我加入了一家传统行业的企业参与其数字化转型的过程&#xff0c;现在我将我的经历分享出来&#xff0c;本文是第三部分—业务篇&#xff0c;主要会介绍一下传统企业通用的三大…