IwbZeroDbMigrator.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System.Data.Entity;
  2. using System.Data.Entity.Migrations;
  3. using System.Transactions;
  4. using Abp.Dependency;
  5. using Abp.Domain.Uow;
  6. using Abp.MultiTenancy;
  7. using IwbZero.Data;
  8. using IwbZero.MultiTenancy;
  9. namespace IwbZero.EntityFramework
  10. {
  11. public abstract class IwbZeroDbMigrator<TDbContext, TConfiguration> : IIwbDbMigrator, ITransientDependency
  12. where TDbContext : DbContext
  13. where TConfiguration : DbMigrationsConfiguration<TDbContext>, IMultiTenantSeed, new()
  14. {
  15. private readonly IUnitOfWorkManager _unitOfWorkManager;
  16. private readonly IDbPerTenantConnectionStringResolver _connectionStringResolver;
  17. private readonly IIocResolver _iocResolver;
  18. protected IwbZeroDbMigrator(
  19. IUnitOfWorkManager unitOfWorkManager,
  20. IDbPerTenantConnectionStringResolver connectionStringResolver,
  21. IIocResolver iocResolver)
  22. {
  23. _unitOfWorkManager = unitOfWorkManager;
  24. _connectionStringResolver = connectionStringResolver;
  25. _iocResolver = iocResolver;
  26. }
  27. public virtual void CreateOrMigrateForHost()
  28. {
  29. CreateOrMigrate(null);
  30. }
  31. public virtual void CreateOrMigrateForTenant(TenantBase tenant)
  32. {
  33. if (string.IsNullOrEmpty(tenant.ConnectionString))
  34. {
  35. return;
  36. }
  37. CreateOrMigrate(tenant);
  38. }
  39. protected virtual void CreateOrMigrate(TenantBase tenant)
  40. {
  41. var args = new DbPerTenantConnectionStringResolveArgs(
  42. tenant == null ? null : tenant.Id as int?,
  43. tenant == null ? MultiTenancySides.Host : MultiTenancySides.Tenant
  44. )
  45. { ["DbContextType"] = typeof(TDbContext), ["DbContextConcreteType"] = typeof(TDbContext) };
  46. var nameOrConnectionString = ConnectionStringHelper.GetConnectionString(
  47. _connectionStringResolver.GetNameOrConnectionString(args)
  48. );
  49. using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.Suppress))
  50. {
  51. using (var dbContext = _iocResolver.ResolveAsDisposable<TDbContext>(new { nameOrConnectionString }))
  52. {
  53. var dbInitializer = new MigrateDatabaseToLatestVersion<TDbContext, TConfiguration>(
  54. true,
  55. new TConfiguration
  56. {
  57. Tenant = tenant
  58. });
  59. dbInitializer.InitializeDatabase(dbContext.Object);
  60. _unitOfWorkManager.Current.SaveChanges();
  61. uow.Complete();
  62. }
  63. }
  64. }
  65. }
  66. }