/// <summary> /// /// </summary> /// <param name="shardingEntityType"></param> /// <param name="tail"></param> /// <exception cref="ShardingCreateException"></exception> public void CreateTable(Type shardingEntityType, string tail) { using (var serviceScope = _serviceProvider.CreateScope()) { var dbContextOptionsProvider = serviceScope.ServiceProvider.GetService <IDbContextOptionsProvider>(); var virtualTable = _virtualTableManager.GetVirtualTable(shardingEntityType); using (var dbContext = _shardingDbContextFactory.Create(new ShardingDbContextOptions(dbContextOptionsProvider.GetDbContextOptions(), tail, new List <VirtualTableDbContextConfig>() { new VirtualTableDbContextConfig(shardingEntityType, virtualTable.GetOriginalTableName(), virtualTable.ShardingConfig.TailPrefix) }))) { var databaseCreator = dbContext.Database.GetService <IDatabaseCreator>() as RelationalDatabaseCreator; try { databaseCreator.CreateTables(); } catch (Exception ex) { _logger.LogWarning($"create table error maybe table:[{virtualTable.GetOriginalTableName()}_{virtualTable.ShardingConfig.TailPrefix}_{tail}]"); throw new ShardingCreateException(" create table error :", ex); } } } }
public void Start() { EnsureCreated(); var virtualTables = _virtualTableManager.GetAllVirtualTables(); using var scope = _serviceProvider.CreateScope(); var dbContextOptionsProvider = scope.ServiceProvider.GetService <IDbContextOptionsProvider>(); using var context = _shardingDbContextFactory.Create(new ShardingDbContextOptions(dbContextOptionsProvider.GetDbContextOptions(), string.Empty, virtualTables.GetVirtualTableDbContextConfigs())); foreach (var virtualTable in virtualTables) { //获取ShardingEntity的实际表名 #if !EFCORE2 var tableName = context.Model.FindEntityType(virtualTable.EntityType).GetTableName(); #endif #if EFCORE2 var tableName = context.Model.FindEntityType(virtualTable.EntityType).Relational().TableName; #endif virtualTable.SetOriginalTableName(tableName); CreateDataTable(virtualTable); } }
private ShardingDbContext GetOrCreateShardingDbContext(string tail) { if (!_dbContextCaches.TryGetValue(tail, out var shardingDbContext)) { var virtualTableConfigs = _virtualTableManager.GetAllVirtualTables().GetVirtualTableDbContextConfigs(); shardingDbContext = _shardingDbContextFactory.Create(new ShardingDbContextOptions(DbContextOptionsProvider.GetDbContextOptions(), tail == EMPTY_SHARDING_TAIL_ID ? string.Empty : tail, virtualTableConfigs)); _dbContextCaches.TryAdd(tail, shardingDbContext); } if (IsOpenTransaction) { _dbTransaction.Use(shardingDbContext); } return((ShardingDbContext)shardingDbContext); }