FreeSql使用
创始人
2024-05-29 15:10:05
0

目的:

1.方库分表
2.主从分离

3.分布式事务

过程:

官网:指南 | FreeSql 官方文档

1.Startup.cs 添加配置(本地数据库MySql)

ConfigureServices:

           Func fsql = r =>{IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, @"Data Source=localhost;Database=testfreesql;User ID=root;Password=123456;pooling=true;port=3306;sslmode=none;CharSet=utf8;").UseMonitorCommand(cmd => Console.WriteLine($"Sql:{cmd.CommandText}"))//监听SQL语句// .UseSlave(@"Data Source = localhost; Database = testfreesql1; User ID = root; Password = 123456; pooling = true; port = 3306; sslmode = none; CharSet = utf8; ", @"Data Source=localhost;Database=testfreesql2;User ID=root;Password=123456;pooling=true;port=3306;sslmode=none;CharSet=utf8;").UseAutoSyncStructure(true) //自动同步实体结构到数据库,FreeSql不会扫描程序集,只有CRUD时才会生成表。.Build();return fsql;};services.AddSingleton(fsql);

Configure:

            //在项目启动时,从容器中获取IFreeSql实例,并执行一些操作:同步表,种子数据,FluentAPI等using (IServiceScope serviceScope = app.ApplicationServices.CreateScope()){var fsql = serviceScope.ServiceProvider.GetRequiredService();fsql.CodeFirst.SyncStructure(typeof(Blog), typeof(User), typeof(AsTableLog));//Topic 为要同步的实体类}

2.引入组件

    

 3.创建类(自动生成表)

 4.接口调用

using Db.Entities;
using FreeSql;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace TestFreeSql.Controllers
{[Route("api/[controller]/[action]")][ApiController]public class FreeSqlController : ControllerBase{//官方文档:https://freesql.net/guide/getting-started.html//demo作者微信(qq):842725037private readonly ILogger _logger;private readonly IFreeSql _freeSql;private readonly DbContext  _dbContext;private IMemoryCache _cache;public FreeSqlController(ILogger logger, IFreeSql freeSql, IMemoryCache cache){_logger = logger;_freeSql = freeSql;_dbContext = freeSql.CreateDbContext();_cache = cache;}/// /// 基础使用(增加、查询、删除、)/// /// [HttpGet]public  async Task TestFreeSqlBase(){//插入单一数据var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };var save =await _freeSql.Insert(blog).ExecuteAffrowsAsync();//查询var select1 =await _freeSql.Select().Where(x => x.BlogId == 1).ToListAsync();var select2 = _freeSql.Select().ToList();//分页查询var select4 = _freeSql.Select().Where(a => a.BlogId > 1);var sql = select4.ToSql();var total = await select4.CountAsync();var list = await select4.Page(1, 20).ToListAsync();//修改var select3 =await _freeSql.Select().FirstAsync();select3.Url = DateTime.Now.ToString();var save2 = await _freeSql.InsertOrUpdate().SetSource(select3).ExecuteAffrowsAsync();//删除var delete =await _freeSql.Delete().Where(x => x.Url == blog.Url).ExecuteAffrowsAsync();return "123";}/// /// 事务使用/// /// [HttpGet]public async Task TestFreeSqlDbContext1(){//工作单元var ctx = _dbContext;var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };ctx.Set().Add(blog);var user = new User() { Name = DateTime.Now.ToString(), Age=1 };ctx.Set().Add(user);var save=await ctx.SaveChangesAsync();return "123";}/// /// 事务使用/// /// [HttpGet]public async Task TestFreeSqlDbContext2(){//工作单元var ctx = _freeSql.CreateDbContext();var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };ctx.Set().Add(blog);var user = new User() { Name = DateTime.Now.ToString(), Age = 1 };ctx.Set().Add(user);var save = await ctx.SaveChangesAsync();return "123";}/// /// 读从库、写主库,伪功能(需要自己实现数据库数据同步)/// /// [HttpGet]public async Task TestFreeSqlReadWrite(){//文档:https://freesql.net/guide/read-write-splitting.htmlvar select2 = _freeSql.Select().Where(x=>x.BlogId>0).ToList();//读取从库//插入单一数据var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };var saveSql =await _freeSql.Insert(blog).ExecuteAffrowsAsync();//写入主库var select3 = _freeSql.Select().ToList();//读取从库var select4 = _freeSql.Select().Master().ToList();//读取主库return "123";}/// /// 分表(自动分表)/// /// [HttpGet]public async Task TestFreeSqlSeparate(){//文档:https://github.com/dotnetcore/FreeSql/discussions/1066//插入单一数据var asTableLog = new AsTableLog() { msg=DateTime.Now.ToString(), createtime=DateTime.Now};var saveSql =await _freeSql.Insert(asTableLog).ExecuteAffrowsAsync();//插入单一数据var asTableLog2 = new AsTableLog() { msg = DateTime.Now.ToString(), createtime = DateTime.Now.AddDays(10) };var saveSql2 =await _freeSql.Insert(asTableLog2).ExecuteAffrowsAsync();//查询var select = _freeSql.Select();//.Where(a => a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1")));var sql = select.ToSql();var list = select.ToList();return "123";}}
}

5.项目地址:

https://github.com/zhihuixitong/TestFreeSql

总结:

1.使用上感觉一般

2.和EF相比唯一有用的分表使用,分库不支持

3.分布式事务看着复杂没有使用

4.读写分离还好,就是要自己实现数据同步

建议:

1.分库分表完善(分库支持)

2.读写分离完善(自动通过配置自己同步数据)

3.分布式事务使用简单化

4.其他基本功能少花点精力优化,重点优化其他组件没有的功能

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...