首页 > 其他分享 >EFCore 分表

EFCore 分表

时间:2024-10-07 16:35:57浏览次数:1  
标签:EFCore BloggingContext var optionsBuilder context 分表 public string

Program

internal class Program
{
    static async Task Main(string[] args)
    {
        DbContextOptionsBuilder<BloggingContext> optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
        optionsBuilder.UseSqlServer("Data Source=localhost;Initial Catalog=DemoA;Integrated Security=True;Encrypt=True;TrustServerCertificate=True;");
        var options = optionsBuilder.Options;

        using (var dbContext1 = new BloggingContext("202209", options))
        {
            var blog = dbContext1.Blogs.FirstOrDefault();
            Console.WriteLine("查询成功: dbContext1");
        }

        using (var dbContext2 = new BloggingContext("202210", options))
        {
            var blog = dbContext2.Blogs.FirstOrDefault();
            Console.WriteLine("查询成功: dbContext2");
        }

        Console.ReadKey();
    }
}

BloggingContext

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    public string ShardingRule { get; }

    public BloggingContext(string shardingRule, DbContextOptions options) : base(options)
    {
        this.ShardingRule = shardingRule;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);

        if (!string.IsNullOrWhiteSpace(this.ShardingRule))
        {
            optionsBuilder.ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactoryDesignTimeSupport>()
                          .ReplaceService<IModelCustomizer, ShardingModelCustomizer>();
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

DynamicModelCacheKeyFactoryDesignTimeSupport

/// <summary>
/// 同一DBContext仅能执行OnModelCreating一次,自定义 IModelCacheKeyFactory,实现多次触发
/// </summary>
public class DynamicModelCacheKeyFactoryDesignTimeSupport : IModelCacheKeyFactory
{
    public object Create(DbContext context, bool designTime)
    {
        return context is BloggingContext bloggingContext 
            ? (context.GetType(), bloggingContext.ShardingRule, designTime)
            : context.GetType();
    }

    public object Create(DbContext context)
       => Create(context, false);
}

ShardingModelCustomizer

/// <summary>
/// 修改模型定义
/// </summary>
public class ShardingModelCustomizer : ModelCustomizer
{
    public ShardingModelCustomizer(ModelCustomizerDependencies dependencies) : base(dependencies)
    {
    }

    public override void Customize(ModelBuilder modelBuilder, DbContext context)
    {
        base.Customize(modelBuilder, context);

        var bloggingContext = context as BloggingContext;
        if (bloggingContext == null) return;

        // 这里为了演示,仅以Blog实体做演示。
        var type = typeof(Blog);

        // 映射到自定表
        modelBuilder.Entity(type).ToTable($"{type.Name}_{bloggingContext.ShardingRule}");
    }
}

标签:EFCore,BloggingContext,var,optionsBuilder,context,分表,public,string
From: https://www.cnblogs.com/readafterme/p/18450239

相关文章

  • ​Excel只能打印一部分表格的原因、解决方法
    怎么办?Excel文件打开之后,正常编辑完了,但是打印文件的时候只打印出表格文件的一部分数据,这是什么原因呢?怎么解决呢?原因一:如果你在打印界面,预览打印内容的时候发现,内容是空的或者只有一个单元格,但是工作表中的表格数据并没有消失,就是没办法打印出整个表格。这是因为在打印设......
  • 【泛微E9】流程打分表实现
    需求描述:流程表单固定带出129行明细,前6项只要有两项打分为-10(-10为固定分值),总分即为0。实现方法:给明细表字段【自定义序号】赋值,通过字段联动带出129行明细。//遍历明细行的写法varrowArr=WfForm.getDetailAllRowIndexStr("detail_1").split(",");vararrScore=[];cons......
  • 分库分表还是分布式?如何用 OceanBase的单机分布式一体化从根本上解决问题
    随着企业业务规模的不断增长,单机集中式的数据库系统逐渐难以承载企业日益增长的数据存储与处理需求。因此,MySQL的分库分表方案成为了众多企业应对数据存储量激增及数据处理能力需求扩张的“止痛药”。尽管这一方案短期内有效缓解了企业面临的大规模数据处理压力,但同时也引发了......
  • SpringBoot整合ShardingJdbc分表
    项目中处理接收设备上报日志需求,上报数据量大,因此对数据进行按日期分表处理。使用技术:ShardingJdbc+rabbitMq+jpa+多线程处理引入所需jar:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</a......
  • 一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案
    前言今天大姚给大家分享一款EFCore下高性能、轻量级针对分表分库读写分离的解决方案,开源(ApacheLicense)的EFCore拓展程序包:ShardingCore。ShardingCore项目介绍ShardingCore是一款开源、简单易用、高性能、普适性,针对EFCore生态下的分表分库的扩展解决方案,支持EFCore2+的所有版......
  • 帝国CMS 多少数据分表好?已发布的数据怎么分表?
    帝国CMS支持分表机制来提高数据库性能和管理大量数据。分表是一种将大量数据分散到多个表中的方法,这样可以减少单个表的大小,从而提高查询效率,特别是在大数据量的情况下。多少数据分表好?根据提供的信息,通常建议在数据量达到一定规模时进行分表。具体建议如下:5万条数据:当某个表......
  • 什么是索引和分库分表?
    1.什么是索引?在关系数据库中,索引是一种数据结构,将数据提前按照一定的规则进行排序和组织,能够帮助快速定位到数据记录的数据,加快数据库表中数据的查找和访问速度。像书籍的目录、文件夹、标签、房号...都可以帮助我们快速定位,都可以视为索引。能实现快速定位数据的一种存储......
  • 分库分表之后,id 主键如何处理?
    问:分库分表之后,id主键如何处理? 其实这是分库分表之后你必然要面对的一个问题,就是id咋生成?因为要是分成多个表之后,每个表都是从1开始累加,那肯定不对啊,需要一个全局唯一的id来支持。所以这都是你实际生产环境中必须考虑的问题。 基于数据库的实现方案 数据库自增id......
  • 设置SQL Server登录账号 只能访问部分表
    设置SQLServer登录账号只能访问部分表xcanel于2020-11-3015:07:05发布阅读量2.2k收藏5点赞数分类专栏:SQL版权数据库权限设置登录账号查询权限更新权限关键词由CSDN通过智能技术生成SQL专栏收录该内容2篇文章0订阅订阅专栏从网上搜了写类似的文字,发现很多文字都有......
  • 分库分表零基础
    一、前言中大型项目中,一旦遇到数据量比较大,就应该对数据进行拆分。有垂直和水平两种。垂直拆分也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库。水平拆分,是同一个业务数据量大之后,进行水平拆分。mysql单表存储量推荐是百万级,如果不进行处理,mysql单表数据太大,会......