| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- using System.Data.Entity;
- using System.Data.Entity.Migrations;
- using System.Transactions;
- using Abp.Dependency;
- using Abp.Domain.Uow;
- using Abp.MultiTenancy;
- using IwbZero.Data;
- using IwbZero.MultiTenancy;
- namespace IwbZero.EntityFramework
- {
- public abstract class IwbZeroDbMigrator<TDbContext, TConfiguration> : IIwbDbMigrator, ITransientDependency
- where TDbContext : DbContext
- where TConfiguration : DbMigrationsConfiguration<TDbContext>, IMultiTenantSeed, new()
- {
- private readonly IUnitOfWorkManager _unitOfWorkManager;
- private readonly IDbPerTenantConnectionStringResolver _connectionStringResolver;
- private readonly IIocResolver _iocResolver;
- protected IwbZeroDbMigrator(
- IUnitOfWorkManager unitOfWorkManager,
- IDbPerTenantConnectionStringResolver connectionStringResolver,
- IIocResolver iocResolver)
- {
- _unitOfWorkManager = unitOfWorkManager;
- _connectionStringResolver = connectionStringResolver;
- _iocResolver = iocResolver;
- }
- public virtual void CreateOrMigrateForHost()
- {
- CreateOrMigrate(null);
- }
- public virtual void CreateOrMigrateForTenant(TenantBase tenant)
- {
- if (string.IsNullOrEmpty(tenant.ConnectionString))
- {
- return;
- }
- CreateOrMigrate(tenant);
- }
- protected virtual void CreateOrMigrate(TenantBase tenant)
- {
- var args = new DbPerTenantConnectionStringResolveArgs(
- tenant == null ? null : tenant.Id as int?,
- tenant == null ? MultiTenancySides.Host : MultiTenancySides.Tenant
- )
- { ["DbContextType"] = typeof(TDbContext), ["DbContextConcreteType"] = typeof(TDbContext) };
- var nameOrConnectionString = ConnectionStringHelper.GetConnectionString(
- _connectionStringResolver.GetNameOrConnectionString(args)
- );
- using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.Suppress))
- {
- using (var dbContext = _iocResolver.ResolveAsDisposable<TDbContext>(new { nameOrConnectionString }))
- {
- var dbInitializer = new MigrateDatabaseToLatestVersion<TDbContext, TConfiguration>(
- true,
- new TConfiguration
- {
- Tenant = tenant
- });
- dbInitializer.InitializeDatabase(dbContext.Object);
- _unitOfWorkManager.Current.SaveChanges();
- uow.Complete();
- }
- }
- }
- }
- }
|