VzDbMigrator.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #nullable enable
  2. using System.Transactions;
  3. using Abp.Dependency;
  4. using Abp.Domain.Uow;
  5. using Abp.EntityFrameworkCore;
  6. using Abp.Extensions;
  7. using Microsoft.EntityFrameworkCore;
  8. using VberZero.BaseSystem.MultiTenancy;
  9. using VberZero.Data;
  10. using VberZero.MultiTenancy;
  11. namespace VberZero.EntityFramework;
  12. public abstract class VzDbMigrator<TDbContext> : IVzDbMigrator, ITransientDependency
  13. where TDbContext : DbContext
  14. {
  15. private readonly IUnitOfWorkManager _unitOfWorkManager;
  16. private readonly IDbPerTenantConnectionStringResolver _connectionStringResolver;
  17. private readonly IDbContextResolver _dbContextResolver;
  18. protected VzDbMigrator(
  19. IUnitOfWorkManager unitOfWorkManager,
  20. IDbPerTenantConnectionStringResolver connectionStringResolver,
  21. IDbContextResolver dbContextResolver)
  22. {
  23. _unitOfWorkManager = unitOfWorkManager;
  24. _connectionStringResolver = connectionStringResolver;
  25. _dbContextResolver = dbContextResolver;
  26. }
  27. public virtual void CreateOrMigrateForHost()
  28. {
  29. CreateOrMigrateForHost(null);
  30. }
  31. public virtual void CreateOrMigrateForHost(Action<TDbContext>? seedAction)
  32. {
  33. CreateOrMigrate(null, seedAction);
  34. }
  35. public virtual void CreateOrMigrateForTenant(Tenant tenant)
  36. {
  37. CreateOrMigrateForTenant(tenant, null);
  38. }
  39. public virtual void CreateOrMigrateForTenant(Tenant? tenant, Action<TDbContext>? seedAction)
  40. {
  41. if (tenant != null && tenant.ConnectionString.IsNullOrEmpty())
  42. {
  43. return;
  44. }
  45. CreateOrMigrate(tenant, seedAction);
  46. }
  47. protected virtual void CreateOrMigrate(Tenant? tenant, Action<TDbContext>? seedAction)
  48. {
  49. var args = new DbPerTenantConnectionStringResolveArgs(
  50. tenant?.Id,
  51. tenant == null ? Abp.MultiTenancy.MultiTenancySides.Host : Abp.MultiTenancy.MultiTenancySides.Tenant
  52. )
  53. {
  54. ["DbContextType"] = typeof(TDbContext),
  55. ["DbContextConcreteType"] = typeof(TDbContext)
  56. };
  57. var nameOrConnectionString = ConnectionStringHelper.GetConnectionString(
  58. _connectionStringResolver.GetNameOrConnectionString(args)
  59. );
  60. using var uow = _unitOfWorkManager.Begin(TransactionScopeOption.Suppress);
  61. using var dbContext = _dbContextResolver.Resolve<TDbContext>(nameOrConnectionString, null);
  62. dbContext.Database.Migrate();
  63. seedAction?.Invoke(dbContext);
  64. _unitOfWorkManager.Current.SaveChanges();
  65. uow.Complete();
  66. }
  67. }