EFCore分表实现( 二 )

构造函数修改上文提到了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分表的实现大致全是这样,没有什么区别 。可以参考一些开源的框架,对现有的系统进行适当的调整,毕竟别人写的并不一定适合你 。希望这篇文章可以帮到你 。

经验总结扩展阅读