FreeSql使用

目的:

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

3.分布式事务

过程:

官网:指南 | FreeSql 官方文档

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

ConfigureServices:

           Func<IServiceProvider, IFreeSql> 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<IFreeSql>(fsql);

Configure:

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

2.引入组件

    <PackageReference Include="FreeSql" Version="3.2.690" />
    <PackageReference Include="FreeSql.Cloud" Version="1.6.3" />
    <PackageReference Include="FreeSql.DbContext" Version="3.2.690" />
    <PackageReference Include="FreeSql.Provider.MySql" Version="3.2.690" />
    <PackageReference Include="FreeSql.Provider.Sqlite" Version="3.2.690" />

 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):842725037


        private readonly ILogger<FreeSqlController> _logger;
        private readonly IFreeSql _freeSql;

        private readonly DbContext  _dbContext;

        private IMemoryCache _cache;
        public FreeSqlController(ILogger<FreeSqlController> logger, IFreeSql freeSql, IMemoryCache cache)
        {
            _logger = logger;
            _freeSql = freeSql;
            _dbContext = freeSql.CreateDbContext();
            _cache = cache;
        }

        /// <summary>
        /// 基础使用(增加、查询、删除、)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public  async Task<string> TestFreeSqlBase()
        {
            //插入单一数据
            var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };
            var save =await _freeSql.Insert<Blog>(blog).ExecuteAffrowsAsync();
            
            //查询
            var select1 =await _freeSql.Select<Blog>().Where(x => x.BlogId == 1).ToListAsync();
            var select2 = _freeSql.Select<Blog>().ToList();


            //分页查询
            var select4 = _freeSql.Select<Blog>()
               .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<Blog>().FirstAsync();
            select3.Url = DateTime.Now.ToString();
            var save2 = await _freeSql.InsertOrUpdate<Blog>().SetSource(select3).ExecuteAffrowsAsync();


            //删除
            var delete =await _freeSql.Delete<Blog>().Where(x => x.Url == blog.Url).ExecuteAffrowsAsync();


            return "123";
        }


        /// <summary>
        /// 事务使用
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<string> TestFreeSqlDbContext1()
        {
            //工作单元
            var ctx = _dbContext;

            var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };
            ctx.Set<Blog>().Add(blog);
   
            var user = new User() { Name = DateTime.Now.ToString(), Age=1 };
            ctx.Set<User>().Add(user);

           var save=await ctx.SaveChangesAsync();


            return "123";
        }

        /// <summary>
        /// 事务使用
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<string> TestFreeSqlDbContext2()
        {
            //工作单元
            var ctx = _freeSql.CreateDbContext();

            var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };
            ctx.Set<Blog>().Add(blog);

            var user = new User() { Name = DateTime.Now.ToString(), Age = 1 };
            ctx.Set<User>().Add(user);

            var save = await ctx.SaveChangesAsync();


            return "123";
        }




        /// <summary>
        /// 读从库、写主库,伪功能(需要自己实现数据库数据同步)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<string> TestFreeSqlReadWrite()
        {
            //文档:https://freesql.net/guide/read-write-splitting.html


            var select2 = _freeSql.Select<Blog>().Where(x=>x.BlogId>0).ToList();//读取从库

            //插入单一数据
            var blog = new Blog() { Rating = 1, Url = DateTime.Now.ToString() };
            var saveSql =await _freeSql.Insert<Blog>(blog).ExecuteAffrowsAsync();//写入主库

            var select3 = _freeSql.Select<Blog>().ToList();//读取从库

            var select4 = _freeSql.Select<Blog>().Master().ToList();//读取主库


            return "123";
        }



        /// <summary>
        /// 分表(自动分表)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<string> 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>(asTableLog).ExecuteAffrowsAsync();

            //插入单一数据
            var asTableLog2 = new AsTableLog() { msg = DateTime.Now.ToString(), createtime = DateTime.Now.AddDays(10) };
            var saveSql2 =await _freeSql.Insert<AsTableLog>(asTableLog2).ExecuteAffrowsAsync();


            //查询
            var select = _freeSql.Select<AsTableLog>();
                    //.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.其他基本功能少花点精力优化,重点优化其他组件没有的功能

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
FreeSql是一种高性能免费开源的ORM框架,可以用于在C#中操作关系型数据库。以下是在C#中使用FreeSql的步骤: 1. 安装FreeSql NuGet包 在Visual Studio中打开NuGet包管理器,搜索FreeSql并安装最新版。 2. 配置数据库连接 在App.config或Web.config文件中添加数据库连接字符串,例如: ```xml <connectionStrings> <add name="MySql" connectionString="Server=localhost;Database=mydatabase;User=root;Password=123456;"/> </connectionStrings> ``` 3. 初始化FreeSql 在应用程序启动时,初始化FreeSql并注册数据提供程序,例如: ```csharp // 初始化FreeSql var connectionString = ConfigurationManager.ConnectionStrings["MySql"].ConnectionString; var fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.MySql, connectionString) .UseAutoSyncStructure(true) .Build(); // 注册数据提供程序 FreeSql.Provider.Register<CustomMySqlProvider>(FreeSql.DataType.MySql); ``` 4. 编写数据访问代码 使用FreeSql的实体类、仓储类和LINQ语句,编写数据访问代码,例如: ```csharp // 定义实体类 public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } // 定义仓储类 public class UserRepository : FreeSqlRepository<User> { public UserRepository() : base() { } public UserRepository(UnitOfWorkManager uowm) : base(uowm) { } } // 使用LINQ语句查询数据 var users = fsql.Select<User>().Where(u => u.Age > 18).ToList(); // 使用仓储类查询数据 var userRepo = new UserRepository(); var user = userRepo.Where(u => u.Name == "Tom").FirstOrDefault(); // 使用事务提交数据 using (var uow = fsql.CreateUnitOfWork()) { var userRepo = uow.GetRepository<User>(); userRepo.Insert(new User { Name = "Jack", Age = 20 }); userRepo.Update(new User { Id = 1, Name = "Tom", Age = 22 }); uow.Commit(); } ``` 以上就是在C#中使用FreeSql的基本步骤,可以根据实际情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧方

开发程序不易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值