写点什么

一款 EF Core 下高性能、轻量级针对分表分库读写分离的解决方案

作者:追逐时光者
  • 2025-10-20
    广东
  • 本文字数:4088 字

    阅读完需:约 13 分钟

前言

今天大姚给大家分享一款 EF Core 下高性能、轻量级针对分表分库读写分离的解决方案,开源(Apache License)的 EF Core 拓展程序包:ShardingCore。

ShardingCore 项目介绍

ShardingCore 是一款开源、简单易用、高性能、普适性,针对 EF Core 生态下的分表分库的扩展解决方案,支持 EF Core2+的所有版本,支持 EF Core2+的所有数据库、支持自定义路由、动态路由、高性能分页、读写分离的一款 EF Core 拓展程序包,一款零依赖第三方组件的扩展。

ShardingCore 项目特性

  • 零依赖、零学习成本、零业务代码入侵。

  • 支持 EF Core 的 Code First 支持表结构的迁移自动化。

  • 支持对数据分表/分库的自定义路由,可以满足几乎 90%的业务分表/分库规则,并且支持外部传入配置。

  • 具有极少数的客户端分片中间件下才有的流式聚合,和特定的高性能分页,具有低内存高性能 O(n),并且支持顺序分页,反向分页,追加排序。

  • 多数据库支持,只要是 EF Core2+支持的数据库 ShardingCore 都是支持的。

  • 等等等...

EF Core 介绍

Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术,EF Core 是适用于 .NET 的现代对象数据库映射器。它支持 LINQ 查询、更改跟踪、更新和架构迁移。EF Core 通过提供程序插件 API 与 SQL Server、Azure SQL 数据库、SQLite、Azure Cosmos DB、MySQL、PostgreSQL 和其他数据库一起使用(微软官方出品)。

值得推荐的.NET ORM 框架

分享了一些比较好用且优秀的.NET ORM 框架:https://mp.weixin.qq.com/s/B47HvbELB-Z-nAY8TxE15g

快速上手 AspNetCore

快速上手示例来源于项目官方文档教程(更多详情请前往项目官方文档地址查阅):https://xuejmnet.github.io/sharding-core-doc/guide/quick-start-aspnetcore

5 步实现按月分表,且支持自动化建表建库。

第一步安装 NuGet 包依赖:

ShardingCore NuGet 包安装:

# 请对应安装您需要的版本PM> Install-Package ShardingCore
复制代码

使用 SqlServer 安装如下 NuGet 包:

PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
复制代码

使用 MySql 安装如下 NuGet 包:

PM> Install-Package Pomelo.EntityFrameworkCore.MySql
复制代码

第二步创建查询对象模型:


    /// <summary>    /// order table    /// </summary>    public class Order    {        /// <summary>        /// order Id        /// </summary>        public string Id { get; set; }        /// <summary>        /// payer id        /// </summary>        public string Payer { get; set; }        /// <summary>        /// pay money cent        /// </summary>        public long Money { get; set; }        /// <summary>        /// area        /// </summary>        public string Area { get; set; }        /// <summary>        /// order status        /// </summary>        public OrderStatusEnum OrderStatus { get; set; }        /// <summary>        /// CreationTime        /// </summary>        public DateTime CreationTime { get; set; }    }    public enum OrderStatusEnum    {        NoPay=1,        Paying=2,        Payed=3,        PayFail=4    }

复制代码

第三步创建 dbcontext:

dbcontext AbstractShardingDbContext 和 IShardingTableDbContext 如果你是普通的 DbContext 那么就继承 AbstractShardingDbContext 需要分表就实现 IShardingTableDbContext,如果只有分库可以不实现 IShardingTableDbContext 接口。


    public class MyDbContext:AbstractShardingDbContext,IShardingTableDbContext    {        public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)        {        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)        {            base.OnModelCreating(modelBuilder);            modelBuilder.Entity<Order>(entity =>            {                entity.HasKey(o => o.Id);                entity.Property(o => o.Id).IsRequired().IsUnicode(false).HasMaxLength(50);                entity.Property(o=>o.Payer).IsRequired().IsUnicode(false).HasMaxLength(50);                entity.Property(o => o.Area).IsRequired().IsUnicode(false).HasMaxLength(50);                entity.Property(o => o.OrderStatus).HasConversion<int>();                entity.ToTable(nameof(Order));            });        }        /// <summary>        /// empty impl if use sharding table        /// </summary>        public IRouteTail RouteTail { get; set; }    }

复制代码

第四步添加分表路由:

/// <summary>/// 创建虚拟路由/// </summary>public class OrderVirtualTableRoute:AbstractSimpleShardingModKeyStringVirtualTableRoute<Order>{    public OrderVirtualTableRoute() : base(2, 3)    {    }
    public override void Configure(EntityMetadataTableBuilder<Order> builder)    {        builder.ShardingProperty(o => o.Id);        builder.AutoCreateTable(null);        builder.TableSeparator("_");    }}

复制代码


第五步配置启动项:

无论你是何种数据库只需要修改 AddDefaultDataSource 里面的链接字符串 请不要修改委托内部的 UseXXX 参数 conStr and connection。


        public void ConfigureServices(IServiceCollection services)        {
            //添加分片配置            services.AddShardingDbContext<MyDbContext>()                .UseRouteConfig(op =>                {                    op.AddShardingTableRoute<OrderVirtualTableRoute>();                }).UseConfig((sp,op) =>                {                                        op.UseShardingQuery((conn, builder) =>                    {                        builder.UseSqlServer(conn);                    });                    op.UseShardingTransaction((conn, builder) =>                    {                        builder.UseSqlServer(conn);                    });                    op.AddDefaultDataSource(Guid.NewGuid().ToString("n"),                        "Data Source=localhost;Initial Catalog=EFCoreShardingTableDB;Integrated Security=True;");                }).AddShardingCore();        }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }                        //not required, enable check table missing and auto create,非必须  启动检查缺少的表并且创建            app.ApplicationServices.UseAutoTryCompensateTable();            // other configure....        }

复制代码

这样所有的配置就完成了你可以愉快地对 Order 表进行取模分表了:

[Route("api/[controller]")]public class ValuesController : Controller{        private readonly MyDbContext _myDbContext;
        public ValuesController(MyDbContext myDbContext)        {            _myDbContext = myDbContext;        }
        [HttpGet]        public async Task<IActionResult> Get()        {            var order = await _myDbContext.Set<Order>().FirstOrDefaultAsync(o => o.Id == "2");            return OK(order)        }}

复制代码

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个 Star 支持💖。

  • GitHub 开源地址:https://github.com/dotnetcore/sharding-core

  • 在线使用文档地址:https://xuejmnet.github.io/sharding-core-doc

优秀项目和框架精选

该项目已收录到 C#/.NET/.NET Core 优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解 C#、.NET 和.NET Core 领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交 PR 推荐或自荐(让优秀的项目和框架不被埋没🤞)。

https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md


发布于: 刚刚阅读数: 3
用户头像

不积跬步无以至千里,不积小流无以成江海! 2020-01-14 加入

微软MVP、华为云HCDE、华为云云享专家、51CTO专家博主、阿里云专家博主、博客园推荐博客、CSDN博客专家、腾讯云创作之星、掘金优秀创作者,一个热爱开源的全栈软件工程师,擅长C#、.NET、Vue等相关技术开发。

评论

发布
暂无评论
一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案_微软_追逐时光者_InfoQ写作社区