ABP EF CORE 7 集成ShardingCore实现分表

.NET Core实现分表分库、读写分离的通用 Repository功能 首先声明这篇文章不是标题党,我说的这个类库是 FreeSql.Repository,它作为扩展库现实了通用仓储层功能,接口规范参考 abp vnext 定义,实现了基础的仓储层(CURD)。 安装 dotnet add package FreeSql.Repository 可用于:.net framework 4.6+、.net core 2.1+ 定义 var fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.Sqlite, @Data Source=|DataDirectory|\d 立即下载

参考文章
Abp VNext 分表分库
.Net下极限生产力之分表分库全自动化Migrations Code-First
官方文档
ShardingCore

原文是在Abp VNext的基础上做了分库分表,本文将基于ABP和EF CORE 7做分表,支持分表和批量更新的系统性能应该会有一个较大的提升。

添加依赖

Install-Package ShardingCore -Version 7.0.0.5

创建实体

public class ToDoItem : AggregateRoot<long>, ISoftDelete, IMayHaveTenant, ICreationAudited, IShardingKeyIsCreationTime
{
    public bool IsDeleted { get; set; }
    public int? TenantId { get; set; }
    public long? CreatorUserId { get; set; }
    public DateTime CreationTime { get; set; }

    public string Text { get; set; }
}

//标识对应的分表对像的分表字段是id时,自动创建guid
public interface IShardingKeyIsGuId
{
}
//标识对应的分表对象的分表字段是创建时间时,自动创建时间
public interface IShardingKeyIsCreationTime
{
}

参考博客中的分表是基于Id做的,那我就试一下基于时间做分表。
正常来说新增实体的话只需要写一个ToDoItem 类就可以了,但参考博客中还定义了两个空接口,那么这两个空接口的作用是什么呢?

从这段代码中我们可以看出,这两个空接口可以帮你自动创建分表字段的值。

其实参考博客中也注释了这两个接口的作用:

我在我的实体代码中修改了这个注释,不知道我的理解对不对。

创建DbContext抽象类

参考博客中使用的是AbstractShardingAbpDbContext这个类,它是继承于AbpDbContext的。

但我的ABP的DbContext是继承于AbpZeroDbContext的。于是我找到了ShardingDbContext抽象类的源码

将AbstractShardingAbpZeroDbContext添加到我的项目中后,并继承AbstractShardingAbpZeroDbContext:

public class MyABP7NET6DbContext : AbstractShardingAbpZeroDbContext<Tenant, Role, User, MyABP7NET6DbContext>
{
    /* Define a DbSet for each entity of the application */
    public virtual DbSet<ToDoItem> ToDoItems { get; set; }

    public MyABP7NET6DbContext(DbContextOptions<MyABP7NET6DbContext> options)
        : base(options)
    {
    }
}

创建分表路由

public class TodoTableRoute : AbstractSimpleShardingMonthKeyDateTimeVirtualTableRoute<ToDoItem>
{
    //分表的开始时间
    public override DateTime GetBeginTime()
    {
        return new DateTime(2022, 10, 1);
    }

    //注意一定要配置或者采用接口+标签也是可以的
    public override void Configure(EntityMetadataTableBuilder<ToDoItem> builder)
    {
        //创建时间按月分表
        builder.ShardingProperty(o => o.CreationTime);
    }

    public override bool AutoCreateTableByTime()
    {
        return true;
    }
}

startup配置

这里我把数据库连接字符串改成了获取配置文件的。
            // 添加分片配置
            services.AddShardingDbContext<MyABP7NET6DbContext>()
                .UseRouteConfig(op =>
                {
                    op.AddShardingTableRoute<TodoTableRoute>();
                }).UseConfig((sp, op) =>
                {
                    op.UseShardingQuery((conn, builder) =>
                    {
                        builder.UseSqlServer(conn);
                    });
                    op.UseShardingTransaction((conn, builder) =>
                    {
                        builder.UseSqlServer(conn);
                    });
                    op.AddDefaultDataSource(
                        Guid.NewGuid().ToString("n"),
                        _appConfiguration["ConnectionStrings:Default"]//"Data Source=localhost;Initial Catalog=EFCoreShardingTableDB;Integrated Security=True;"
                    );
                }).AddShardingCore();
            // sharding-core
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            // not required, enable check table missing and auto create,非必须  启动检查缺少的表并且创建
            app.ApplicationServices.UseAutoTryCompensateTable();

创建Controller

需要注入DbContext

[Route("api/[controller]/[action]")]
public class ToDoItemController : MyABP7NET6ControllerBase
{
    private readonly MyABP7NET6DbContext _dbContext;

    public ToDoItemController(
        MyABP7NET6DbContext dbContext
        )
    {
        _dbContext = dbContext;
    }

    [HttpPost]
    public async Task Add()
    {
        var msg = "测试数据";
        var currentTime = DateTime.Now;

        var list = await _dbContext.Set<ToDoItem>().ToListAsync();//如果数据中含有不符合路由条件的数据,会报错
        Console.WriteLine($"新增前数量:{list.Count}");

        await _dbContext.Set<ToDoItem>().AddAsync(new ToDoItem()
        {
            CreationTime = currentTime,
            Text = msg
        });

        await _dbContext.SaveChangesAsync();
        list = await _dbContext.Set<ToDoItem>().ToListAsync();
        Console.WriteLine($"新增后数量:{list.Count}");
    }

    [HttpPost]
    public async Task UpdateBatch()
    {
        _dbContext.Set<ToDoItem>().AsQueryable().ExecuteUpdate(update => update.SetProperty(x => x.CreationTime, x => x.CreationTime.AddYears(-10)));
    }
}

创建数据库迁移

PM> Add-Migration Add_ToDoItem
PM> update-database

因为在分表路由中配置了开始分表时间是2022-10-01,我现在是11月,所以框架自动创建了10月和11月两个表。

测试

调用Add和UpdateBatch接口

可以发现数据按照CreationTime自动分表了。
需要注意的是,使用EF CORE 7 的 ExecuteUpdate如果不写时间条件的话,会更新所有分表。

FDTD仿真进阶:液晶偏振调控与双折射效应全解析 本文深入解析了在Lumerical FDTD仿真中如何对液晶材料进行偏振调控与双折射效应建模。通过单轴液晶和螺旋扭曲液晶(TN-LCD)两大实战案例,详细阐述了从各向异性材料参数设置、LC网格属性配置到偏振椭圆分析的全流程,帮助工程师精准模拟液晶的光开关行为,优化如显示器等器件的光学性能。 阅读详情

相关推荐

【ISAR成像定标方法(1)—转台目标的RD成像算法MATLAB仿真】

ISAR成像定标方法的研究具有重要意义,但是与之相关的学习资料以及仿真对于小白来说很难找或者很杂乱,本人作为小白之一在研究过程中苦不堪言,现在自己所要研究的定标内容已经完成,以后还学不学雷达也不一定,因为后面的路更难,现在打算把一些相关推导和仿真结果列出来,以供小白交流学习使用,希望能有点帮助。(PS:由于公式和符号的原因,采用图片形式说明)

此木旧年的博客 6416

EFCore实现数据库水平分表的方法

MySQL使用EFCore框架水平分表的实现方法,即一个实体映射到多个数据表。通过该方法可以实现动态映射,根据不同的条件映射到不同的数据表。

初夏de遐想的博客 8994

告别手动打点计时:用Lauterbach TRACE32的RunTime功能,5分钟搞定嵌入式代码段性能分析

本文深入解析了Lauterbach TRACE32的RunTime功能在嵌入式代码性能分析中的革命性应用。通过硬件级计时原理和非侵入式设计,该功能能快速精确测量代码执行时间,显著提升开发效率,特别适用于汽车电子和工业控制领域。文章还提供了从基础设置到高级分析的完整实战指南,帮助工程师轻松掌握这一强大工具。

weixin_30615767的博客 277

EFCore亿级分库分表跨表分页查询技巧

前言在常规的应用系统开发中,很少会涉及到需要对数据进行分库或者分表的操作,多数情况下,我们习惯使用ORM带来的便利,且使用连接查询是一种高效率的开发方式,就算涉及到分表的场景,很多时候也都可以使用ORM自带的分表规则来解决问题。比如在电商场景中,用户和订单是属于重点增量的数据,通常情况下,或者按用户编号取模或者按订单编号取模进行分表,按便利性来区分,可以使用按用户编号分表解决后续跨表分页查询问题,...

farway000的博客 2884

保姆级教程:用ComfyUI+LTX-Video插件,5分钟搞定你的第一个AI视频(RTX 4060实测)

本文提供了一份详细的ComfyUI与LTX-Video插件使用指南,帮助用户在RTX 4060显卡上快速生成AI视频。从环境部署到图形化操作,再到提示词优化和性能调优,全面覆盖AI视频生成的各个环节,让零基础用户也能轻松上手。

weixin_33743661的博客 136

SMPLify-X关键点映射与OpenPose格式转换实战

本文深入解析了SMPLify-X与OpenPose之间关键点映射与格式转换的实战方法。针对SMPL、SMPL-H、SMPLX等参数化人体模型与OpenPose 2D姿态估计标准之间的数据鸿沟,文章详细对比了双方的关键点定义差异,并提供了核心的Python转换代码与映射表构建思路。通过清晰的步骤讲解与调试技巧,帮助开发者实现3D关节数据到OpenPose标准格式的高效、准确转换,为动作捕捉、3D姿态估计等应用奠定数据基础。

weixin_29046035的博客 166

Abp VNext 集成sharding-core 分表分库

目录 背景 如何集成 abp项目创建/下载 集成abp思路 abp集成注意事项 赋值依赖注入支持domain event等事件 自动属性 了解sahrding-core针对dbcontext的分表支持 如何接入sharding-core abp正式接入替换 修改TodoItem实体 实现抽象类修改TodoItemDbContext 修改实体TodoItem 添加虚拟路由 abp启动 修改TodoAppEntityFrameworkCoreModule 运行TodoApp.W

寒冰屋的专栏 1312

AI算力网络与通信领域流量分析:优化策略探讨_副本

今天的AI就像一个"超级吃货",每天要"吃"掉海量数据、“消耗"巨量算力——训练一个千亿参数的大模型,可能需要上万块GPU同时工作数周,其间产生的数据传输量足以填满数百万个1TB硬盘。这些GPU和计算节点通过网络连接形成"AI算力网络”,而数据在节点间的流动就是"通信流量"。如果把算力比作AI的"肌肉",那流量就是"血液"——血液不通畅,肌肉再强也使不上劲。

AI天才研究院 1197

基于 PostgreSQL 的 ABP vNext + ShardingCore 分库分表实战

本文介绍了如何基于 PostgreSQL 数据库,结合 ABP vNext 框架和 ShardingCore 中间件,实现分库分表的高性能解决方案。随着数据量的增长,单表性能瓶颈和存储压力成为问题,分库分表成为解决大数据、高并发场景的有效手段。文章详细介绍了技术选型,包括 ABP vNext、EF Core、PostgreSQL、ShardingCore 等,并提供了 Docker Compose 环境配置、分表初始化脚本、appsettings.json 样板以及 NuGet 包安装步骤。

Kookoos的博客 1449

实战指南:UOS专业版命令行高效下载离线安装包及依赖

本文提供了一份UOS专业版离线安装包的实战下载指南。针对无外网环境下的软件部署难题,详细介绍了如何通过命令行精准获取软件包名,并利用`apt download`命令高效下载主程序及其所有依赖。文章重点解析了使用`apt install --dry-run`模拟安装来完整获取依赖包的方法,并给出了离线安装、问题排查及自动化脚本编写等高级技巧,帮助管理员和运维人员实现可靠的批量离线部署。

honey的博客 1109

使用conda环境python3.13和python3.12下安装vllm过程记录

使用conda环境python3.13和python3.12下安装vllm过程记录

没刮胡子的程序员专栏 885

突破数据瓶颈:ShardingCore 7.x 零入侵分库分表实战指南

# 突破数据瓶颈:ShardingCore 7.x 零入侵分库分表实战指南 > 你还在为 EF Core 项目的大数据量表查询性能下降而烦恼吗?还在纠结分库分表改造带来的业务代码入侵吗?本文将带你通过 5 个步骤实现高性能分库分表,无需重构现有代码,让系统轻松支撑千万级数据量。 读完本文你将获得: - 掌握 ShardingCore 7.x 的核心架构与零入侵设计原理 - 实现按月/按哈希的分...

gitblog_01403的博客 481

2025年华为杯中国研究生数学建模竞赛E题 高速列车轴承智能故障诊断问题 思路+代码

all_data, file_info = preprocessor.load_mat_files(file_list[:50]) # 加载前50个文件作为示例。[y_source, y_source, domain_labels], # 注意:这里使用伪标签。X_target = np.random.randn(100, X_source.shape[1], 1) # 示例数据。"""构建CNN-Transformer混合模型""""""构建Transformer模型"""

YOLO 1046

ShardingCore 7.0 版本发布

NCC ShardingCore 是一款 EntityFramework Core based 高性能、轻量级、分表分库、读写分离解决方案,具有零依赖、零学习成本、零业务代码入侵等特点。ShardingCore 7.0 已于近期发布。从 ShardingCore 7.0 开始,启用版本号第二位来对应不同的 EFCore 版本,如7.6.0.5针对的是EFCore 6.x等。变更日志添加对...

dotNET跨平台 577

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

mysql读写分离 abp_.NET Core实现分表分库、读写分离的通用 Repository功能

首先声明这篇文章不是标题党,我说的这个类库是 FreeSql.Repository,它作为扩展库现实了通用仓储层功能,接口规范参考 abp vnext 定义,实现了基础的仓储层(CURD)。安装dotnet add package FreeSql.Repository可用于:.net framework 4.6+、.net core 2.1+定义var fsql = new FreeSql.Fre...

weixin_39912368的博客 839

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

mysql读写分离 abp_.NETCore 下支持分表分库、读写分离的通用 Repository

首先声明这篇文章不是标题党,我说的这个类库是 FreeSql.Repository,它作为扩展库现实了通用仓储层功能,接口规范参数 abp vnext,定义和实现基础的仓储层(CURD)。安装dotnet add package FreeSql.Repository定义varfsql=newFreeSql.FreeSqlBuilder().UseConnectionString(FreeS...

weixin_39646405的博客 582

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

.Net下极限生产力之efcore分表分库全自动化迁移CodeFirst

开始本次我们的主题就是极限生产力,其他语言望尘莫及的分表分库全自动化Migrations Code-First 加 efcore 分表分库无感开发还记得上次发布博客还是在上次,上次发布了如何兼容WTM框架后也有不少小伙伴来问我如何兼容如何迁移等问题,经过这么多框架的兼容我自己也认识到了一些问题,譬如在ShardingCore初始化前使用(毕竟efcore)的初始化是在依赖...

dotNET跨平台 1695

ABP开发框架前后端开发系列——框架的总体介绍

ABP开发框架前后端开发系列——框架的总体介绍 ABP是ASP.NET Boilerplate的简称,ABP是一个开源且文档友好的应用程序框架。 ABP不仅仅是一个框架,它还提供了一个最徍实践的基于领域驱动设计(DDD)的体系结构模型。 学习使用ABP框架也有一段时间了,一直想全面了解下这个框架的整个来龙去脉,并把它使用历程整理成一个系列出来,不过一直没有下笔来写这篇文章的开篇,就是希望能够深入了解,再深入了解一些,希望自己能够理解透彻一些,不能误人子弟,也不想和网上千篇一律的翻译官网的内容,官网的英文介绍

原在路上的博客。 5825

ABP分层架构

一框架概要 名称 说明 展现层(Presentation) 提供一个用户界面,实现用户交互操作。 应用层(Application) 进行展现层与领域层之间的协调,协调业务对象来执行特定的应用程序的任务。它不包含业务逻辑。 领域层(Domain) 包括业务对象和业务规则,这是应用程序的核心层。 基础设施层(Infrastructure) 提供通用技术...

xie__jin__cheng的博客 2114

谈谈EFCore.Sharding(EFCore开源分表框架)的使用

前言 早上起来,上洗手间的间隙,看到了这篇文章,刚好以前分享过一篇关于EF core的读写分离的文章链接地址:https://blog.csdn.net/weixin_41372626/article/details/105343648。今日来分享一下如何利用第三方框架轻松实现读写分离分库分表。 文章整理并转载自:微信公众号dotNET博士 简介 本框架旨在为EF Core提供Shard...

覃鸿宇的博客 3182

.NET 分表分库动态化处理

本期主角:ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案,具有零依赖、零学习成本、零业务代码入侵

寒冰屋的专栏 636

efcore根据多个条件更新_.NET开源分表框架:EFCore.Sharding

【开源项目】|作者/ 寒空飞箭一个为EF Core提供Sharding的开源框架在博客园上小编Edison高兴地发现了一个为EF Core提供读写分离分库分表支持的开源框架EFCore.Sharding,因此特破例于今日周二转载此文以快速地分享与各位童鞋。本文作者寒空飞箭,该项目源码地址传送门:https://github.com/Coldairarrow/EFCore.Shardi...

weixin_39868414的博客 646

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

ShardingCore是一款开源、简单易用、高性能、普适性,针对EF Core生态下的分表分库的扩展解决方案,支持EF Core2+的所有版本,支持EF Core2+的所有数据库、支持自定义路由、动态路由、高性能分页、读写分离的一款EF Core拓展程序包,一款零依赖第三方组件的扩展。Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术,EF Core 是适用于 .NET 的现代对象数据库映射器。

sdgfafg_25的博客 904

一款针对EF Core轻量级分表分库、读写分离的开源项目

欢迎加入学习小圈子,一起打卡交流学习。在项目开发中,如果数据量比较大,比如日志记录,我们往往会采用分表分库的方案;为了提升性能,把数据库查询与更新操作分开,这时候就要采用读写分离的方案。分表分库通常包含垂直分库、垂直分表、水平分库和水平分表方案,包括分表分库方案,实现每一个方案都需要花费一定的时间;所以,今天给大家推荐一个基于EF Code实现的分表分库、读写分离开源库,可以让我们零成本的接入...

zls365365的博客 277

ShardingCore:EF Core下高性能、轻量级分表分库读写分离解决方案

ShardingCore:EF Core下高性能、轻量级分表分库读写分离解决方案

寒冰屋的专栏 1558

ABP学习实践(十四)--执行自定义SQL语句,创建动态表

在日常的开发工作中,有时我们需要在应用程序中直接执行SQL语句,比如动态创建数据库表、自定义查询等,利用ABP框架的仓储特性和EntityFramework Core的特性就能实现这个功能。 1.执行自定义SQL语句 网上可以查到不少通过EFCore执行SQL语句的文章,但有些是比较早的,相关方法可能已经废弃了,也有结合ABP仓储实现的,但有些地方感觉也没写明白。 1.1 创建自定义仓储 在领域层(一般是Core项目)中添加自定义仓储接口。 public interface ISqlReposito

lordwish的专栏 2534
上一篇: 麒麟银河Excel对应的Content-Type
下一篇: No component for supporting the service System.IServiceProvider was found
ZZHSourceCode
博客等级 码龄9年 8粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值