Beispiel #1
0
        /// <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);
        }