Database数据库的分库分表,表映射,切换表,使用到了IModelCacheKeyFactory

代码如下:

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;namespace EFCOREDB
{class Program{static void Main(string[] args){Console.WriteLine("Hello World!");#region 测试TestDBContext(); #endregionConsole.Read();}#region Database数据库操作/// <summary>/// 测试数据库的分库分表,表映射,切换表/// </summary>static void TestDBContext(){#region DBContext//DateTime datetime1 = DateTime.Now;//using (var context = new DynamicContext { CreateDateTime = datetime1 })//{//    Console.WriteLine("开始删除数据库");//    context.Database.EnsureDeleted();//    Console.WriteLine("删除成功");//    Console.WriteLine("开始创建数据库");//    context.Database.EnsureCreated();//    Console.WriteLine("创建成功");//    var tablename = context.Model.FindEntityType(typeof(Test)).GetTableName();//    #region MyRegion//    //context.Tests.Add(new Test { Title = "Great News One", Content = $"Hello World! I am the news of {datetime1}", CreateDateTime = datetime1 });//    //更新实体的方式//    //0、查询实体,修改实体字段,context.SaveChanges();//    //1、创建实体,context.Entry(创建的实体).State=EntityState.Modified; context.SaveChanges();//    //2、创建实体,context.Update(创建的实体); context.SaveChanges();//    //3、创建实体,context.DbSet<Test>.Attach(创建的实体); context.Entry(创建的实体).State=EntityState.Modified; context.SaveChanges();//    //3、创建实体,context.DbSet<Test>.Attach(创建的实体); context.ChangeTracker.DetectChanges(); context.SaveChanges();//    //3、创建实体,context.Attach(创建的实体); context.Entry(创建的实体).State=EntityState.Modified; context.SaveChanges();//    //4、context.ChangeTracker.TrackGraph(ss, e => {//    //    if ((e.Entry.Entity as Test) != null)//    //    {//    //        e.Entry.State = EntityState.Unchanged;//    //    }//    //    else//    //    {//    //        e.Entry.State = EntityState.Modified;//    //    }//    //});//    //context.SaveChanges(); //    #endregion//    var ss = new Test { Title = "11", Content = $"111 {datetime1}", CreateDateTime = datetime1 };//    Console.WriteLine($"context.Entry(ss).State:{context.Entry(ss).State}");//    //context.Attach(ss);//告诉EF Core开始跟踪person实体的更改,因为调用DbContext.Attach方法后,EF Core会将person实体的State值(可以通过testDBContext.Entry(ss).State查看到)更改回EntityState.Unchanged,所以这里testDBContext.Attach(ss)一定要放在下面一行testDBContext.Entry(ss).Property(p => p.Content).IsModified = true的前面,否者后面的testDBContext.SaveChanges方法调用后,数据库不会被更新//    //context.Entry(ss).Property(p => p.Content).IsModified = true;//告诉EF Core实体ss的Content属性已经更改。将testDBContext.Entry(person).Property(p => p.Name).IsModified设置为true后,也会将ss实体的State值(可以通过testDBContext.Entry(ss).State查看到)更改为EntityState.Modified,这样就保证了下面SaveChanges的时候会将ss实体的Content属性值Update到数据库中。//    //context.Entry(ss).Property(p => p.Content).IsModified = true;//    //context.Tests.Attach(ss);//    context.Attach(ss);//    Console.WriteLine($"context.Entry(ss).State:{context.Entry(ss).State}");//    //context.ChangeTracker.DetectChanges();//    context.SaveChanges();//}切换表//DateTime datetime2 = DateTime.Now.AddDays(-1);//using (var context = new DynamicContext { CreateDateTime = datetime2 })//{//    var tablename = context.Model.FindEntityType(typeof(Test)).GetTableName();//查询实体映射到数据库中对应的表名称//    if (!tablename.Equals("20201118"))//    {//        //var str = GetMySQLSqls(datetime2);//        var str = GetSqlServerSqls(datetime2);//        //判断是否存在表,不存在则创建//        using var cmd = context.Database.GetDbConnection().CreateCommand();//        cmd.CommandText = str[0];//        if (cmd.Connection.State != System.Data.ConnectionState.Open)//        {//            cmd.Connection.Open();//        }//        var result = cmd.ExecuteScalar();//        if (result.ToString() == "0")//        {//            //创建新表//            context.Database.ExecuteSqlRaw(str[1]);//        }//    }//    //context.Database.EnsureCreated();//    context.Tests.Add(new Test { Title = "22", Content = $"222 {datetime2}", CreateDateTime = datetime2 });//    context.SaveChanges();//}//using (var context = new DynamicContext { CreateDateTime = datetime1 })//{//    var entity = context.Tests.Single();//    // Writes news of today//    Console.WriteLine($"{entity.Title} {entity.Content} {entity.CreateDateTime}");//}//using (var context = new DynamicContext { CreateDateTime = datetime2 })//{//    var entity = context.Tests.Single();//    // Writes news of yesterday//    Console.WriteLine($"{entity.Title} {entity.Content} {entity.CreateDateTime}");//} #endregion}#region Database数据库操作private static string[] GetMySQLSqls(DateTime time){string tableName = time.ToString("yyyyMMdd");string decide = $"SELECT count(1) FROM information_schema.TABLES WHERE table_name='{tableName}'";string sqlRaw = $@"
CREATE TABLE IF NOT EXISTS `{tableName}` (`Id` int(20) NOT NULL,`Title` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,`Content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,`CreateDateTime` datetime(6) NOT NULL,PRIMARY KEY (`Id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
";return new string[] { decide, sqlRaw };}private static string[] GetSqlServerSqls(DateTime time){//注意:[Id] int NOT NULL IDENTITY(1,1)中的 IDENTITY(1,1) 表示自增string tableName = time.ToString("yyyyMMdd");//-- 判断要创建的表名是否存在 select * from dbo.sysobjects where id=object_id(N'[dbo].[{0}]') and xtype='U'string decide = $"SELECT COUNT(1) FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[{tableName}]') and OBJECTPROPERTY(id, N'IsUserTable') = 1";string sqlRaw = $@"IF NOT EXISTS ( SELECT * FROM dbo.sysobjects WHERE id=object_id(N'[dbo].[{tableName}]') AND xtype='U')
BEGIN
CREATE TABLE [dbo].[{tableName}] (
[Id] int NOT NULL IDENTITY(1,1),
[Title] nvarchar(20) NULL ,
[Content] nvarchar(500) NULL ,
[CreateDateTime] datetime2(7) NOT NULL ,
);
ALTER TABLE [dbo].[{tableName}] ADD PRIMARY KEY ([Id]);
END";return new string[] { decide, sqlRaw };}private static string[] GetOracleSqls(string defaultSchema, DateTime time){string tableName = time.ToString("yyyyMMdd");string schema = defaultSchema;string id_seq = $"{tableName}_id_seq";var pk = $"PK_{tableName}";string decide = $"SELECT COUNT(1) FROM all_tables WHERE TABLE_NAME='{tableName}' AND OWNER='{schema}'";string sqlRaw =
$@"DECLARE num NUMBER;
BEGINSELECTCOUNT(1) INTO num FROMall_tables WHERETABLE_NAME = '{tableName}' AND OWNER = '{schema}';IFnum = 0 THENEXECUTE IMMEDIATE 'CREATE TABLE ""{schema}"".""{tableName}"" (""Id"" NUMBER(10) NOT NULL,""Title"" NVARCHAR2(20),""Content"" NCLOB,""CreateDateTime"" TIMESTAMP(7) NOT NULL,CONSTRAINT ""{pk}"" PRIMARY KEY(""Id""),)';EXECUTE IMMEDIATE 'CREATE SEQUENCE ""{schema}"".""{id_seq}"" START WITH 1 INCREMENT BY 1';END IF;END; ";return new string[] { decide, sqlRaw };}#endregion#endregion}public class Test{public int Id { get; set; }public string Title { get; set; }public string Content { get; set; }public DateTime CreateDateTime { get; set; }}public class DynamicContext : DbContext{public DateTime CreateDateTime { get; set; }//为了区分不同的表public DbSet<Test> Tests { get; set; }//sqlserver连接字符串 Server=(localdb)\\mssqllocaldb;Database=DynamicContext;Trusted_Connection=True;//sqlserver连接字符串 server=127.0.0.1;database=DynamicContext;user=zy;password=zy;//oracle连接字符串 Data Source=127.0.0.1:1521/orcl;User Id=zy;Password=zy;//"DbConnectString": "Data Source=127.0.0.1:1521/orcl;User Id=zy;Password=zy;",//"DefaultSchema": "ZY", //"DbVersion": "11", //mysql连接字符串 server=127.0.0.1;database=DynamicContext;user=zy;password=zy;//public static string DbConnectString = "(localdb)\\mssqllocaldb;Database=DynamicContext;Trusted_Connection=True;";//如果是oracle的话,Oracle连接字符串中并不包含数据名称,其实DefaultSchema就是数据库名称,音系需要下面的两个DefaultSchema,DbVersion字段public static string DefaultSchema = "ZY";//public static string DbVersion = "11";DbType dbType = DbType.SqlServer;#region OnConfiguringprotected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){switch (dbType){case DbType.SqlServer:string DbConnectStringSqlServer = "(localdb)\\mssqllocaldb;Database=DynamicContext;Trusted_Connection=True;";DbConnectStringSqlServer = "server=127.0.0.1;database=DynamicContext;user=zy;password=zy;";DbConnectStringSqlServer = "server=127.0.0.1;database=DynamicContext;user=sa;password=sa123;";optionsBuilder.UseSqlServer(DbConnectStringSqlServer).ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();break;case DbType.MySql:string DbConnectStringMySql = "server=127.0.0.1;database=DynamicContext;user=zy;password=zy;";DbConnectStringMySql = "server=127.0.0.1;database=DynamicContext;user=root;password=123456;";optionsBuilder.UseMySql(DbConnectStringMySql).ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();break;case DbType.Oracle:string DbConnectStringOracle = "Data Source=127.0.0.1:1521/orcl;User Id=zy;Password=zy;";optionsBuilder.UseOracle(DbConnectStringOracle, t => t.UseOracleSQLCompatibility(DbVersion)).ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();break;default:throw new Exception("数据库不匹配。。。");}}//=> optionsBuilder.UseMySql(DbConnectString).ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();//=> optionsBuilder.UseOracle(DbConnectString).ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();//=> optionsBuilder.UseSqlServer(DbConnectString).ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();//protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)//=> optionsBuilder.UseInMemoryDatabase("DynamicContext")//.ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();#endregion#region OnModelCreatingprotected override void OnModelCreating(ModelBuilder modelBuilder){if (Database.IsOracle()){modelBuilder.HasDefaultSchema(DefaultSchema);}modelBuilder.Entity<Test>(b =>{b.ToTable(CreateDateTime.ToString("yyyyMMdd"));b.HasKey(p => p.Id);//b.Property(p => p.Id).HasColumnType("int").ValueGeneratedOnAdd();//b.Property(p => p.Id).HasColumnType("int");b.Property(p => p.Title).HasMaxLength(20);b.Property(p => p.Content).HasMaxLength(500);});}#endregion}public enum DbType{SqlServer,MySql,Oracle}public class DynamicModelCacheKeyFactory : IModelCacheKeyFactory{public object Create(DbContext context) => context is DynamicContext dynamicContext ? (context.GetType(), dynamicContext.CreateDateTime) : (object)context.GetType();}
}

Database数据库的分库分表,表映射,切换表,使用到了IModelCacheKeyFactory 代码如下:相关推荐

  1. MySQL数据库的分库分表方案

    MySQL数据库的分库分表方案 一. 数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数 ...

  2. 数据库面试 - 分库分表

    数据库面试 - 分库分表 面试题 为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?你们具体是如何对数据库如何进行垂直拆分 ...

  3. 数据库面试 - 分库分表之后,id 主键如何处理?

    数据库面试 - 分库分表之后,id 主键如何处理? 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后, ...

  4. 第8章 数据库的分库分表

    8-1 数据库分库分表的几种方式 1把一个实例中的多个数据库拆分到不同的实例 2把一个数据库中的表分离到不同的数据库中 3对一个库中的相关表进行水平拆分到不同实例的数据库中(大多数) 8-2 数据库分 ...

  5. 原生分布式数据库与分库分表中间件、云原生数据库有何区别

    如今,我们正处于数据库从互联网基础软件转变为社会数字化基础软件的时代,在传统集中式数据库已不能满足大规模数据承载需求与高并发处理需求的形势下,基于海量数据场景应用而生的分布式数据库迎来应用热潮.据ID ...

  6. mysql- 如何对数据库进行分库分表,不允许停止服务

    如何对数据库进行分库分表,不允许停止服务 方案1-2(参考下文中的第二,第三方案) refer 方案3 第一阶段: 编写代理层和DAO层,代理层动态开关,决定写的是新表还是旧表,此时流量仍然是访问旧表 ...

  7. 【数据库】分库分表策略

    关系型数据库本身比较容易成为系统瓶颈,单机存储容量.连接数.处理能力都有限.当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库.优化索引,做很多操作时性能仍下降严重.此时就要考 ...

  8. 数据库(分库分表)中间件对比

    转自:http://www.cnblogs.com/cangqiongbingchen/p/7094822.html 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张 ...

  9. 面试官 | 说一下数据库如何分库分表?

    作者 | butterfly100 来源 | cnblogs.com/butterfly100/p/9034281.html 一. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量.连接数 ...

最新文章

  1. JB的测试之旅-上传的mp3文件播放不了
  2. Go 使用 append 向切片增加元素
  3. Spark-1.4.0集群搭建
  4. J2ME手机游戏引擎程序结构简述
  5. Lync与Exchange 2013 UM集成:Lync Server配置
  6. POJ 3744:Scout YYF I 概率DP+特征方程+快速幂
  7. Dockerfile制作自定义镜像
  8. 7-13 统计工龄 (20分)
  9. 平面方程(Plane Equation)求解方法
  10. 使用Git提交代码时出现Author identity unknow
  11. odoo 销售订单自动生成制造订单
  12. 锤炼腹肌的好方法:健腹轮的折叠刀式俯卧撑
  13. 计算机课件脚本ppt,ppt课件脚本的写法
  14. k8s学习笔记——ceph rbd本地手动挂载
  15. MySQL登录报错1045解决办法-1045-Access denied for user ‘root‘@‘‘(using password:YES)
  16. pytorch中的reshape()、view()、nn.flatten()和flatten()
  17. Win10无法彻底删除蓝牙设备,无线蓝牙鼠标连接后不能删除
  18. 浅谈分布式学习(SGD)中提高速率的方法
  19. 对象数组排序,利用jquery
  20. 托福培训大连百家外语托福托福各个科目的词汇量有什么要求

热门文章

  1. php微信 发送信息,PHP微信企业号主动给用户发送消息接口代码
  2. Google 内部的 Python 代码风格指南
  3. 高斯混合模型(GMM)源代码实现(二)
  4. 网络结构(1)ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
  5. 约翰·邓普顿给投资者的建议
  6. C语言通信网络最小生成树,《数据结构》课程设计任务书
  7. 让自己注册的网页记住密码
  8. VC_SkinMagic使用方法总结
  9. Windows安装配置Apache简易服务器-----(详细,成功率极高)
  10. 同样的环境同样的安装目录arx提示加载不上