构造函数修改上文提到了ShardingRule
这个属性的出现 , 如何给这个属性赋值呢?有两种方式:
- 构造函数传参
- 通过接口获取
public string ShardingRule { get; set; } public DbContextBase(string shardingRule, DbContextOptions options) : base(options) {ShardingRule = shardingRule; }
通过接口获取IShardingRule
是实现规则名称的自定义接口,自行实现 protected DbContextBase(DbContextOptions options, IServiceProvider serviceProvider): base(options) {ShardingRule = (serviceProvider.GetService<IShardingRule>()).GetValue(); }
使用方式这里只介绍构造函数传参使用方式 DbContextOptionsBuilder<DbContextBase> optionsBuilder = new DbContextOptionsBuilder<DbContextBase>(); optionsBuilder.UseSqlServer("connStr"); var options =optionsBuilder.Options; using (var dbContext = new DbContextBase("202209", options)) {//TODO.... }
跨上下文使用事务这里需要主要的是,跨上下文使用事务必须使用同一个连接,所以optionsBuilder.UseSqlServer(connection);
这里的写法改变一下,使用同一连接DbContextOptionsBuilder<DbContextBase> optionsBuilder = new DbContextOptionsBuilder<DbContextBase>();IDbConnection connection = new SqlConnection("connStr");optionsBuilder.UseSqlServer(connection);var options =optionsBuilder.Options;using (var dbContext = new DbContextBase("202209", options)){using (vartransaction =await dbContext.Database.BeginTransactionAsync()){using (var dbContext2 = new DbContextBase("202210", options)){await dbContext2.Database.UseTransactionAsync(transaction);//TODO....transaction.Commit();}}}
总结EFCore分表的实现大致全是这样,没有什么区别 。可以参考一些开源的框架,对现有的系统进行适当的调整,毕竟别人写的并不一定适合你 。希望这篇文章可以帮到你 。经验总结扩展阅读
- 利用msg_msg实现任意地址读写
- 用AR Engine手部骨骼跟踪能力实现虚拟手表试戴
- 争做新时代自信好少年
- 一个人该如何去实现自己的理想
- 含源码 手把手教你使用LabVIEW人工智能视觉工具包快速实现传统Opencv算子的调用
- Jmix 中 REST API 的两种实现
- 含源码 手把手教你使用LabVIEW人工智能视觉工具包快速实现图像读取与采集
- 之三 2流高手速成记:SpringBoot整合mybatis/mybatis-plus实现数据持久化
- 一百一十九 salesforce零基础学习In-App Guidance实现引导页操作功能
- 五 JPA - 原生SQL实现增删改查