Пример #1
0
        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);
        }
Пример #2
0
        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();
            }
        }
Пример #3
0
        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));
        }
Пример #4
0
        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);
        }
Пример #5
0
        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;
            }
        }
Пример #7
0
 public virtual TDbContext Resolve <TDbContext>(IConnectionStringResolver connectionStringResolver)
 {
     return((TDbContext)Activator.CreateInstance(typeof(TDbContext), connectionStringResolver.GetNameOrConnectionString()));
 }