public virtual TDbContext GetOrCreateDbContext <TDbContext>() where TDbContext : DbContext { var connectionString = _connectionStringResolver.GetNameOrConnectionString(_siteId); var dbContextKey = typeof(TDbContext).FullName + "#" + connectionString; DbContext dbContext; if (!_activeDbContexts.TryGetValue(dbContextKey, out dbContext)) { if (Options.IsTransactional) { dbContext = _transactionStrategy.CreateDbContext <TDbContext>(connectionString); } else { dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString); } if (Options.Timeout.HasValue && !dbContext.Database.CommandTimeout.HasValue) { dbContext.Database.CommandTimeout = (int)Convert.ChangeType(Options.Timeout.Value.TotalSeconds, typeof(int)); } ((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (sender, args) => { ObjectContext_ObjectMaterialized(dbContext, args); }; _activeDbContexts[dbContextKey] = dbContext; } return((TDbContext)dbContext); }
public virtual void CreateOrMigrate(Action <string> logger) { var args = new ConnectionStringResolveArgs { ["DbContextType"] = typeof(TDbContext), ["DbContextConcreteType"] = typeof(TDbContext) }; string nameOrConnectionString = ConnectionStringHelper.GetConnectionString( _connectionStringResolver.GetNameOrConnectionString(args) ); logger($"Name or ConnectionString: {nameOrConnectionString}\nCurrent DbContext: {typeof(TDbContext).GetTypeInfo().Name}"); using (IUnitOfWorkCompleteHandle uow = _unitOfWorkManager.Begin(new UnitOfWorkOptions { Timeout = TimeSpan.FromSeconds(_configuration.TransactionTimeout) }) ) { _migrationStrategies.ForEach(strategy => { logger("--------------------------------------------------------"); strategy.Migrate <TDbContext, TConfiguration>(nameOrConnectionString, MigrationAssembly, logger); }); _unitOfWorkManager.Current.SaveChanges(); uow.Complete(); } }
public TDbContext GetDbContext <TDbContext>() where TDbContext : DbContext { var connectionStringResolveArgs = new ConnectionStringResolveArgs() //MultiTenancySides { ["DbContextType"] = typeof(TDbContext) }; var connectionString = _connectionStringResolver.GetNameOrConnectionString(connectionStringResolveArgs); return(_dbContextResolver.Resolve <TDbContext>(connectionString, null)); }
public string GetNameOrConnectionString() { var slaveConfigs = config.ConfigItem.Slaves.Where(p => p.Offline == false).ToList(); if (slaveConfigs == null || slaveConfigs.Count <= 0) { return(defaultConnectionStringResolver.GetNameOrConnectionString()); } if (slaveConfigs.Count == 1 && !config.ConfigItem.SlaveRandomization) { return(slaveConfigs[0].ConnectionStringName); } Random random = new Random(Guid.NewGuid().GetHashCode()); return(slaveConfigs[random.Next(slaveConfigs.Count)].ConnectionStringName); }
public virtual EfCoreDbContext GetOrCreateDbContext(MultiTenancySides?multiTenancySides) { var connectionString = _connectionStringResolver.GetNameOrConnectionString(multiTenancySides ?? MultiTenancySides.Tenant, GetTenantId()); EfCoreDbContext dbContext; if (!ActiveDbContexts.TryGetValue(connectionString, out dbContext)) { dbContext = _dbContextResolver.Resolve(connectionString); BeginTransaction(dbContext, connectionString); ActiveDbContexts[connectionString] = dbContext; } return(dbContext); }
public virtual void CreateOrMigrate() { var connectionString = _connectionStringResolver.GetNameOrConnectionString(); try { using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.Suppress)) { using (var dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString, null)) { _logger.LogInformation("Migrating database associated with context {DbContextName}", typeof(TDbContext).Name); dbContext.Database.EnsureCreated(); dbContext.Database.Migrate(); if (_seeder != null) { _seeder.SeedAsync(dbContext); } // Explicit call save changes because we aren't using a repository here! dbContext.SaveChanges(); uow.Complete(); _logger.LogInformation("Migrated database associated with context {DbContextName}", typeof(TDbContext).Name); } } } catch (Exception ex) { _logger.LogError(ex, "An error occurred while migrating the database used on context {DbContextName}", typeof(TDbContext).Name); throw ex; } }
public virtual TDbContext Resolve <TDbContext>(IConnectionStringResolver connectionStringResolver) { return((TDbContext)Activator.CreateInstance(typeof(TDbContext), connectionStringResolver.GetNameOrConnectionString())); }