From 17082a23658d697f229ccc296c6611544546e148 Mon Sep 17 00:00:00 2001 From: meysamhadeli Date: Mon, 23 Jan 2023 15:36:08 +0330 Subject: [PATCH 1/2] feat: Add retry failure for Npgsql --- src/BuildingBlocks/EFCore/AppDbContextBase.cs | 76 +++++-------------- src/BuildingBlocks/EFCore/EfTxBehavior.cs | 27 +++---- src/BuildingBlocks/EFCore/Extensions.cs | 2 + src/BuildingBlocks/EFCore/IDbContext.cs | 4 +- .../Data/PersistMessageDbContext.cs | 8 +- .../IPersistMessageDbContext.cs | 4 +- .../PersistMessageProcessor.cs | 3 +- .../Flight/src/Flight/Data/FlightDbContext.cs | 8 +- .../src/Identity/Data/IdentityContext.cs | 62 +++++---------- .../src/Passenger/Data/PassengerDbContext.cs | 8 +- 10 files changed, 67 insertions(+), 135 deletions(-) diff --git a/src/BuildingBlocks/EFCore/AppDbContextBase.cs b/src/BuildingBlocks/EFCore/AppDbContextBase.cs index 437a589..b826f3c 100644 --- a/src/BuildingBlocks/EFCore/AppDbContextBase.cs +++ b/src/BuildingBlocks/EFCore/AppDbContextBase.cs @@ -6,66 +6,41 @@ using BuildingBlocks.Core.Model; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; using System.Data; -using System.Security.Claims; -using Microsoft.AspNetCore.Http; +using Web; using Exception = System.Exception; public abstract class AppDbContextBase : DbContext, IDbContext { - private readonly IHttpContextAccessor _httpContextAccessor; - private IDbContextTransaction _currentTransaction; + private readonly ICurrentUserProvider _currentUserProvider; - protected AppDbContextBase(DbContextOptions options, IHttpContextAccessor httpContextAccessor = default) : + protected AppDbContextBase(DbContextOptions options, ICurrentUserProvider currentUserProvider) : base(options) { - _httpContextAccessor = httpContextAccessor; + _currentUserProvider = currentUserProvider; } protected override void OnModelCreating(ModelBuilder builder) { - // ref: https://github.com/pdevito3/MessageBusTestingInMemHarness/blob/main/RecipeManagement/src/RecipeManagement/Databases/RecipesDbContext.cs } - public async Task BeginTransactionAsync(CancellationToken cancellationToken = default) + //ref: https://learn.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency#execution-strategies-and-transactions + public Task ExecuteTransactionalAsync(CancellationToken cancellationToken = default) { - if (_currentTransaction != null) + var strategy = Database.CreateExecutionStrategy(); + return strategy.ExecuteAsync(async () => { - return; - } - - _currentTransaction ??= await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken); - } - - public async Task CommitTransactionAsync(CancellationToken cancellationToken = default) - { - try - { - await SaveChangesAsync(cancellationToken); - await _currentTransaction?.CommitAsync(cancellationToken)!; - } - catch - { - await RollbackTransactionAsync(cancellationToken); - throw; - } - finally - { - _currentTransaction?.Dispose(); - _currentTransaction = null; - } - } - - public async Task RollbackTransactionAsync(CancellationToken cancellationToken = default) - { - try - { - await _currentTransaction?.RollbackAsync(cancellationToken)!; - } - finally - { - _currentTransaction?.Dispose(); - _currentTransaction = null; - } + await using var transaction = await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken); + try + { + await SaveChangesAsync(cancellationToken); + await transaction.CommitAsync(cancellationToken); + } + catch + { + await transaction.RollbackAsync(cancellationToken); + throw; + } + }); } public override async Task SaveChangesAsync(CancellationToken cancellationToken = default) @@ -100,7 +75,7 @@ public abstract class AppDbContextBase : DbContext, IDbContext foreach (var entry in ChangeTracker.Entries()) { var isAuditable = entry.Entity.GetType().IsAssignableTo(typeof(IAggregate)); - var userId = GetCurrentUserId(); + var userId = _currentUserProvider.GetCurrentUserId(); if (isAuditable) { @@ -133,13 +108,4 @@ public abstract class AppDbContextBase : DbContext, IDbContext throw new Exception("try for find IAggregate", ex); } } - - private long? GetCurrentUserId() - { - var nameIdentifier = _httpContextAccessor?.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier); - - long.TryParse(nameIdentifier, out var userId); - - return userId; - } } diff --git a/src/BuildingBlocks/EFCore/EfTxBehavior.cs b/src/BuildingBlocks/EFCore/EfTxBehavior.cs index e156fec..393fb5d 100644 --- a/src/BuildingBlocks/EFCore/EfTxBehavior.cs +++ b/src/BuildingBlocks/EFCore/EfTxBehavior.cs @@ -42,29 +42,20 @@ public class EfTxBehavior : IPipelineBehavior), typeof(TRequest).FullName); - await _dbContextBase.BeginTransactionAsync(cancellationToken); - try - { - var response = await next(); + var response = await next(); - _logger.LogInformation( - "{Prefix} Executed the {MediatrRequest} request", - nameof(EfTxBehavior), - typeof(TRequest).FullName); + _logger.LogInformation( + "{Prefix} Executed the {MediatrRequest} request", + nameof(EfTxBehavior), + typeof(TRequest).FullName); - var domainEvents = _dbContextBase.GetDomainEvents(); + var domainEvents = _dbContextBase.GetDomainEvents(); - await _eventDispatcher.SendAsync(domainEvents.ToArray(), typeof(TRequest), cancellationToken); + await _eventDispatcher.SendAsync(domainEvents.ToArray(), typeof(TRequest), cancellationToken); - await _dbContextBase.CommitTransactionAsync(cancellationToken); + await _dbContextBase.ExecuteTransactionalAsync(cancellationToken); - return response; - } - catch (System.Exception ex) - { - await _dbContextBase.RollbackTransactionAsync(cancellationToken); - throw; - } + return response; } } diff --git a/src/BuildingBlocks/EFCore/Extensions.cs b/src/BuildingBlocks/EFCore/Extensions.cs index 45d76f3..e6d74ba 100644 --- a/src/BuildingBlocks/EFCore/Extensions.cs +++ b/src/BuildingBlocks/EFCore/Extensions.cs @@ -35,6 +35,8 @@ public static class Extensions dbOptions => { dbOptions.MigrationsAssembly(typeof(TContext).Assembly.GetName().Name); + //ref: https://learn.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency + dbOptions.EnableRetryOnFailure(3, TimeSpan.FromSeconds(1), null); }) // https://github.com/efcore/EFCore.NamingConventions .UseSnakeCaseNamingConvention(); diff --git a/src/BuildingBlocks/EFCore/IDbContext.cs b/src/BuildingBlocks/EFCore/IDbContext.cs index af53ad3..48ac238 100644 --- a/src/BuildingBlocks/EFCore/IDbContext.cs +++ b/src/BuildingBlocks/EFCore/IDbContext.cs @@ -7,8 +7,6 @@ public interface IDbContext { DbSet Set() where TEntity : class; IReadOnlyList GetDomainEvents(); - Task BeginTransactionAsync(CancellationToken cancellationToken = default); - Task CommitTransactionAsync(CancellationToken cancellationToken = default); - Task RollbackTransactionAsync(CancellationToken cancellationToken = default); + Task ExecuteTransactionalAsync(CancellationToken cancellationToken = default); Task SaveChangesAsync(CancellationToken cancellationToken = default); } diff --git a/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs b/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs index 73e1f2d..c5058e5 100644 --- a/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs +++ b/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs @@ -16,7 +16,7 @@ public class PersistMessageDbContext : DbContext, IPersistMessageDbContext { } - public DbSet PersistMessages { get; set; } + public DbSet PersistMessages => Set(); protected override void OnModelCreating(ModelBuilder builder) { @@ -48,13 +48,13 @@ public class PersistMessageDbContext : DbContext, IPersistMessageDbContext }); try { - await policy.ExecuteAsync(async () => await base.SaveChangesAsync(cancellationToken)); + return await policy.ExecuteAsync(async () => await base.SaveChangesAsync(cancellationToken)); } catch (DbUpdateConcurrencyException ex) { foreach (var entry in ex.Entries) { - var currentEntity = entry.Entity; + var currentEntity = entry.Entity; // we can use it for specific merging var databaseValues = await entry.GetDatabaseValuesAsync(cancellationToken); if (databaseValues != null) @@ -65,8 +65,6 @@ public class PersistMessageDbContext : DbContext, IPersistMessageDbContext return await base.SaveChangesAsync(cancellationToken); } - - return 0; } private void OnBeforeSaving() diff --git a/src/BuildingBlocks/PersistMessageProcessor/IPersistMessageDbContext.cs b/src/BuildingBlocks/PersistMessageProcessor/IPersistMessageDbContext.cs index 0eee375..e74d944 100644 --- a/src/BuildingBlocks/PersistMessageProcessor/IPersistMessageDbContext.cs +++ b/src/BuildingBlocks/PersistMessageProcessor/IPersistMessageDbContext.cs @@ -2,10 +2,8 @@ namespace BuildingBlocks.PersistMessageProcessor; -using EFCore; - public interface IPersistMessageDbContext { - DbSet PersistMessages { get; set; } + DbSet PersistMessages { get; } Task SaveChangesAsync(CancellationToken cancellationToken = default); } diff --git a/src/BuildingBlocks/PersistMessageProcessor/PersistMessageProcessor.cs b/src/BuildingBlocks/PersistMessageProcessor/PersistMessageProcessor.cs index f1815a6..8dc5c6e 100644 --- a/src/BuildingBlocks/PersistMessageProcessor/PersistMessageProcessor.cs +++ b/src/BuildingBlocks/PersistMessageProcessor/PersistMessageProcessor.cs @@ -6,11 +6,12 @@ using BuildingBlocks.IdsGenerator; using BuildingBlocks.Utils; using MassTransit; using MediatR; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace BuildingBlocks.PersistMessageProcessor; +using Microsoft.EntityFrameworkCore; + public class PersistMessageProcessor : IPersistMessageProcessor { private readonly ILogger _logger; diff --git a/src/Services/Flight/src/Flight/Data/FlightDbContext.cs b/src/Services/Flight/src/Flight/Data/FlightDbContext.cs index a13cabe..96a18d9 100644 --- a/src/Services/Flight/src/Flight/Data/FlightDbContext.cs +++ b/src/Services/Flight/src/Flight/Data/FlightDbContext.cs @@ -6,12 +6,12 @@ using Microsoft.EntityFrameworkCore; namespace Flight.Data; -using Microsoft.AspNetCore.Http; +using BuildingBlocks.Web; public sealed class FlightDbContext : AppDbContextBase { - public FlightDbContext(DbContextOptions options, IHttpContextAccessor httpContextAccessor = default) : base( - options, httpContextAccessor) + public FlightDbContext(DbContextOptions options, ICurrentUserProvider currentUserProvider = default) : base( + options, currentUserProvider) { } @@ -23,8 +23,8 @@ public sealed class FlightDbContext : AppDbContextBase protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); - builder.FilterSoftDeletedProperties(); builder.ApplyConfigurationsFromAssembly(typeof(FlightRoot).Assembly); + builder.FilterSoftDeletedProperties(); builder.ToSnakeCaseTables(); } } diff --git a/src/Services/Identity/src/Identity/Data/IdentityContext.cs b/src/Services/Identity/src/Identity/Data/IdentityContext.cs index f819f9a..93f6afc 100644 --- a/src/Services/Identity/src/Identity/Data/IdentityContext.cs +++ b/src/Services/Identity/src/Identity/Data/IdentityContext.cs @@ -34,54 +34,32 @@ public sealed class IdentityContext : IdentityDbContext + { + await using var transaction = await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken); + try + { + await SaveChangesAsync(cancellationToken); + await transaction.CommitAsync(cancellationToken); + } + catch + { + await transaction.RollbackAsync(cancellationToken); + throw; + } + }); + } + public override async Task SaveChangesAsync(CancellationToken cancellationToken = default) { OnBeforeSaving(); return await base.SaveChangesAsync(cancellationToken); } - public async Task BeginTransactionAsync(CancellationToken cancellationToken = default) - { - if (_currentTransaction != null) - { - return; - } - - _currentTransaction = await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken); - } - - public async Task CommitTransactionAsync(CancellationToken cancellationToken = default) - { - try - { - await SaveChangesAsync(cancellationToken); - await _currentTransaction?.CommitAsync(cancellationToken)!; - } - catch - { - await RollbackTransactionAsync(cancellationToken); - throw; - } - finally - { - _currentTransaction?.Dispose(); - _currentTransaction = null; - } - } - - public async Task RollbackTransactionAsync(CancellationToken cancellationToken = default) - { - try - { - await _currentTransaction?.RollbackAsync(cancellationToken)!; - } - finally - { - _currentTransaction?.Dispose(); - _currentTransaction = null; - } - } - public IReadOnlyList GetDomainEvents() { var domainEntities = ChangeTracker diff --git a/src/Services/Passenger/src/Passenger/Data/PassengerDbContext.cs b/src/Services/Passenger/src/Passenger/Data/PassengerDbContext.cs index 53d534b..c33ba84 100644 --- a/src/Services/Passenger/src/Passenger/Data/PassengerDbContext.cs +++ b/src/Services/Passenger/src/Passenger/Data/PassengerDbContext.cs @@ -1,16 +1,15 @@ using System.Reflection; using BuildingBlocks.EFCore; using Microsoft.EntityFrameworkCore; +using BuildingBlocks.Web; namespace Passenger.Data; -using Microsoft.AspNetCore.Http; - public sealed class PassengerDbContext : AppDbContextBase { public PassengerDbContext(DbContextOptions options, - IHttpContextAccessor httpContextAccessor = default) : - base(options, httpContextAccessor) + ICurrentUserProvider currentUserProvider = default) : + base(options, currentUserProvider) { } @@ -20,6 +19,7 @@ public sealed class PassengerDbContext : AppDbContextBase { builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); base.OnModelCreating(builder); + builder.FilterSoftDeletedProperties(); builder.ToSnakeCaseTables(); } } From d54ecc9bb8e2c4f5a244d62123af752c54be5bdc Mon Sep 17 00:00:00 2001 From: meysamhadeli Date: Mon, 23 Jan 2023 16:32:51 +0330 Subject: [PATCH 2/2] fix: Fix unhandled error in OnBeforeSaving db-context --- src/BuildingBlocks/EFCore/AppDbContextBase.cs | 3 +- src/BuildingBlocks/EFCore/Extensions.cs | 15 +++++---- .../Data/PersistMessageDbContext.cs | 24 +++++++++----- .../Flight/Data/DesignTimeDbContextFactory.cs | 2 +- .../Flight/src/Flight/Data/FlightDbContext.cs | 2 +- .../tests/UnitTest/Common/DbContextFactory.cs | 6 +--- .../src/Identity/Data/IdentityContext.cs | 33 +++++++++++-------- .../InfrastructureExtensions.cs | 1 + .../Data/DesignTimeDbContextFactory.cs | 2 +- .../src/Passenger/Data/PassengerDbContext.cs | 3 +- 10 files changed, 51 insertions(+), 40 deletions(-) diff --git a/src/BuildingBlocks/EFCore/AppDbContextBase.cs b/src/BuildingBlocks/EFCore/AppDbContextBase.cs index b826f3c..4ffcccc 100644 --- a/src/BuildingBlocks/EFCore/AppDbContextBase.cs +++ b/src/BuildingBlocks/EFCore/AppDbContextBase.cs @@ -4,7 +4,6 @@ using System.Collections.Immutable; using BuildingBlocks.Core.Event; using BuildingBlocks.Core.Model; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Storage; using System.Data; using Web; using Exception = System.Exception; @@ -75,7 +74,7 @@ public abstract class AppDbContextBase : DbContext, IDbContext foreach (var entry in ChangeTracker.Entries()) { var isAuditable = entry.Entity.GetType().IsAssignableTo(typeof(IAggregate)); - var userId = _currentUserProvider.GetCurrentUserId(); + var userId = _currentUserProvider?.GetCurrentUserId() ?? 0; if (isAuditable) { diff --git a/src/BuildingBlocks/EFCore/Extensions.cs b/src/BuildingBlocks/EFCore/Extensions.cs index e6d74ba..bb3b0c0 100644 --- a/src/BuildingBlocks/EFCore/Extensions.cs +++ b/src/BuildingBlocks/EFCore/Extensions.cs @@ -32,12 +32,12 @@ public static class Extensions Guard.Against.Null(options, nameof(postgresOptions)); options.UseNpgsql(postgresOptions?.ConnectionString, - dbOptions => - { - dbOptions.MigrationsAssembly(typeof(TContext).Assembly.GetName().Name); - //ref: https://learn.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency - dbOptions.EnableRetryOnFailure(3, TimeSpan.FromSeconds(1), null); - }) + dbOptions => + { + dbOptions.MigrationsAssembly(typeof(TContext).Assembly.GetName().Name); + //ref: https://learn.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency + dbOptions.EnableRetryOnFailure(3, TimeSpan.FromSeconds(1), null); + }) // https://github.com/efcore/EFCore.NamingConventions .UseSnakeCaseNamingConvention(); }); @@ -88,7 +88,8 @@ public static class Extensions // Replace table names entity.SetTableName(entity.GetTableName()?.Underscore()); - var tableObjectIdentifier = StoreObjectIdentifier.Table(entity.GetTableName()?.Underscore()!, entity.GetSchema()); + var tableObjectIdentifier = + StoreObjectIdentifier.Table(entity.GetTableName()?.Underscore()!, entity.GetSchema()); // Replace column names foreach (var property in entity.GetProperties()) diff --git a/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs b/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs index c5058e5..0b4df06 100644 --- a/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs +++ b/src/BuildingBlocks/PersistMessageProcessor/Data/PersistMessageDbContext.cs @@ -8,6 +8,7 @@ using Configurations; using Core.Model; using global::Polly; using Microsoft.Extensions.Logging; +using Exception = System.Exception; public class PersistMessageDbContext : DbContext, IPersistMessageDbContext { @@ -69,18 +70,25 @@ public class PersistMessageDbContext : DbContext, IPersistMessageDbContext private void OnBeforeSaving() { - foreach (var entry in ChangeTracker.Entries()) + try { - switch (entry.State) + foreach (var entry in ChangeTracker.Entries()) { - case EntityState.Modified: - entry.Entity.Version++; - break; + switch (entry.State) + { + case EntityState.Modified: + entry.Entity.Version++; + break; - case EntityState.Deleted: - entry.Entity.Version++; - break; + case EntityState.Deleted: + entry.Entity.Version++; + break; + } } } + catch (Exception ex) + { + throw new Exception("try for find IVersion", ex); + } } } diff --git a/src/Services/Flight/src/Flight/Data/DesignTimeDbContextFactory.cs b/src/Services/Flight/src/Flight/Data/DesignTimeDbContextFactory.cs index b9a7a6c..6047782 100644 --- a/src/Services/Flight/src/Flight/Data/DesignTimeDbContextFactory.cs +++ b/src/Services/Flight/src/Flight/Data/DesignTimeDbContextFactory.cs @@ -11,7 +11,7 @@ namespace Flight.Data builder.UseNpgsql("Server=localhost;Port=5432;Database=flight;User Id=postgres;Password=postgres;Include Error Detail=true") .UseSnakeCaseNamingConvention(); - return new FlightDbContext(builder.Options); + return new FlightDbContext(builder.Options, null); } } } diff --git a/src/Services/Flight/src/Flight/Data/FlightDbContext.cs b/src/Services/Flight/src/Flight/Data/FlightDbContext.cs index 96a18d9..b1945e3 100644 --- a/src/Services/Flight/src/Flight/Data/FlightDbContext.cs +++ b/src/Services/Flight/src/Flight/Data/FlightDbContext.cs @@ -10,7 +10,7 @@ using BuildingBlocks.Web; public sealed class FlightDbContext : AppDbContextBase { - public FlightDbContext(DbContextOptions options, ICurrentUserProvider currentUserProvider = default) : base( + public FlightDbContext(DbContextOptions options, ICurrentUserProvider currentUserProvider) : base( options, currentUserProvider) { } diff --git a/src/Services/Flight/tests/UnitTest/Common/DbContextFactory.cs b/src/Services/Flight/tests/UnitTest/Common/DbContextFactory.cs index c068f6f..50331a8 100644 --- a/src/Services/Flight/tests/UnitTest/Common/DbContextFactory.cs +++ b/src/Services/Flight/tests/UnitTest/Common/DbContextFactory.cs @@ -1,12 +1,8 @@ using System; using System.Collections.Generic; -using Flight.Aircrafts.Models; -using Flight.Airports.Models; using Flight.Data; using Flight.Flights.Enums; -using Flight.Flights.Models; using Flight.Seats.Enums; -using Flight.Seats.Models; using Microsoft.EntityFrameworkCore; namespace Unit.Test.Common @@ -18,7 +14,7 @@ namespace Unit.Test.Common var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString()).Options; - var context = new FlightDbContext(options); + var context = new FlightDbContext(options, currentUserProvider: null); // Seed our data FlightDataSeeder(context); diff --git a/src/Services/Identity/src/Identity/Data/IdentityContext.cs b/src/Services/Identity/src/Identity/Data/IdentityContext.cs index 93f6afc..b0c5753 100644 --- a/src/Services/Identity/src/Identity/Data/IdentityContext.cs +++ b/src/Services/Identity/src/Identity/Data/IdentityContext.cs @@ -16,13 +16,12 @@ using Microsoft.EntityFrameworkCore.Storage; namespace Identity.Data; +using System; + public sealed class IdentityContext : IdentityDbContext, IDbContext { - private IDbContextTransaction _currentTransaction; - - public IdentityContext(DbContextOptions options, IHttpContextAccessor httpContextAccessor = default) : - base(options) + public IdentityContext(DbContextOptions options) : base(options) { } @@ -40,7 +39,8 @@ public sealed class IdentityContext : IdentityDbContext { - await using var transaction = await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken); + await using var transaction = + await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken); try { await SaveChangesAsync(cancellationToken); @@ -79,18 +79,25 @@ public sealed class IdentityContext : IdentityDbContext()) + try { - switch (entry.State) + foreach (var entry in ChangeTracker.Entries()) { - case EntityState.Modified: - entry.Entity.Version++; - break; + switch (entry.State) + { + case EntityState.Modified: + entry.Entity.Version++; + break; - case EntityState.Deleted: - entry.Entity.Version++; - break; + case EntityState.Deleted: + entry.Entity.Version++; + break; + } } } + catch (Exception ex) + { + throw new Exception("try for find IVersion", ex); + } } } diff --git a/src/Services/Identity/src/Identity/Extensions/Infrastructure/InfrastructureExtensions.cs b/src/Services/Identity/src/Identity/Extensions/Infrastructure/InfrastructureExtensions.cs index 09b286c..3b2a449 100644 --- a/src/Services/Identity/src/Identity/Extensions/Infrastructure/InfrastructureExtensions.cs +++ b/src/Services/Identity/src/Identity/Extensions/Infrastructure/InfrastructureExtensions.cs @@ -33,6 +33,7 @@ public static class InfrastructureExtensions var configuration = builder.Configuration; var env = builder.Environment; + builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/src/Services/Passenger/src/Passenger/Data/DesignTimeDbContextFactory.cs b/src/Services/Passenger/src/Passenger/Data/DesignTimeDbContextFactory.cs index d56404d..87860fb 100644 --- a/src/Services/Passenger/src/Passenger/Data/DesignTimeDbContextFactory.cs +++ b/src/Services/Passenger/src/Passenger/Data/DesignTimeDbContextFactory.cs @@ -11,6 +11,6 @@ public class DesignTimeDbContextFactory: IDesignTimeDbContextFactory options, - ICurrentUserProvider currentUserProvider = default) : + public PassengerDbContext(DbContextOptions options, ICurrentUserProvider currentUserProvider) : base(options, currentUserProvider) { }