mirror of
https://github.com/meysamhadeli/booking-microservices.git
synced 2026-04-18 18:02:12 +08:00
some change in test base
This commit is contained in:
parent
31dc05f580
commit
5007aaaead
@ -6,13 +6,13 @@ using DotNetCore.CAP.Messages;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OpenTelemetry.Trace;
|
||||
|
||||
namespace BuildingBlocks.CAP;
|
||||
|
||||
public static class Extensions
|
||||
{
|
||||
public static IServiceCollection AddCustomCap<TDbContext>(this IServiceCollection services) where TDbContext : DbContext
|
||||
public static IServiceCollection AddCustomCap<TDbContext>(this IServiceCollection services)
|
||||
where TDbContext : DbContext
|
||||
{
|
||||
var rabbitMqOptions = services.GetOptions<RabbitMQOptions>("RabbitMq");
|
||||
|
||||
|
||||
@ -1,21 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using EasyCaching.Core;
|
||||
using EasyCaching.Core;
|
||||
using MediatR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BuildingBlocks.Caching
|
||||
{
|
||||
namespace BuildingBlocks.Caching;
|
||||
|
||||
public class CachingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
|
||||
where TRequest : notnull, IRequest<TResponse>
|
||||
where TResponse : notnull
|
||||
{
|
||||
private readonly ILogger<CachingBehavior<TRequest, TResponse>> _logger;
|
||||
private readonly IEasyCachingProvider _cachingProvider;
|
||||
private readonly ICacheRequest _cacheRequest;
|
||||
private readonly IEasyCachingProvider _cachingProvider;
|
||||
private readonly ILogger<CachingBehavior<TRequest, TResponse>> _logger;
|
||||
private readonly int defaultCacheExpirationInHours = 1;
|
||||
|
||||
public CachingBehavior(IEasyCachingProviderFactory cachingFactory,
|
||||
@ -31,12 +26,9 @@ namespace BuildingBlocks.Caching
|
||||
public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken,
|
||||
RequestHandlerDelegate<TResponse> next)
|
||||
{
|
||||
|
||||
if (request is not ICacheRequest || _cacheRequest == null)
|
||||
{
|
||||
// No cache request found, so just continue through the pipeline
|
||||
return await next();
|
||||
}
|
||||
|
||||
var cacheKey = _cacheRequest.CacheKey;
|
||||
var cachedResponse = await _cachingProvider.GetAsync<TResponse>(cacheKey);
|
||||
@ -60,4 +52,3 @@ namespace BuildingBlocks.Caching
|
||||
return response;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,10 @@
|
||||
namespace BuildingBlocks.Domain.Model;
|
||||
|
||||
public interface IEntity
|
||||
{
|
||||
long Id { get; }
|
||||
}
|
||||
|
||||
public interface IEntity<out TId>
|
||||
{
|
||||
TId Id { get; }
|
||||
|
||||
@ -27,10 +27,14 @@ public abstract class AppDbContextBase : DbContext, IDbContext
|
||||
base.OnModelCreating(builder);
|
||||
}
|
||||
|
||||
public async Task BeginTransactionAsync(IsolationLevel isolationLevel,
|
||||
CancellationToken cancellationToken = default)
|
||||
public async Task BeginTransactionAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
_currentTransaction ??= await Database.BeginTransactionAsync(isolationLevel, cancellationToken);
|
||||
if (_currentTransaction != null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_currentTransaction = await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken);
|
||||
}
|
||||
|
||||
public async Task CommitTransactionAsync(CancellationToken cancellationToken = default)
|
||||
|
||||
@ -41,7 +41,7 @@ public class EfIdentityTxBehavior<TRequest, TResponse> : IPipelineBehavior<TRequ
|
||||
nameof(EfTxBehavior<TRequest, TResponse>),
|
||||
typeof(TRequest).FullName);
|
||||
|
||||
await _dbContextBase.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken);
|
||||
await _dbContextBase.BeginTransactionAsync(cancellationToken);
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@ -45,7 +45,7 @@ public class EfTxBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TRe
|
||||
nameof(EfTxBehavior<TRequest, TResponse>),
|
||||
typeof(TRequest).FullName);
|
||||
|
||||
await _dbContextBase.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken);
|
||||
await _dbContextBase.BeginTransactionAsync(cancellationToken);
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@ -9,7 +9,7 @@ public interface IDbContext
|
||||
DbSet<TEntity> Set<TEntity>()
|
||||
where TEntity : class;
|
||||
IReadOnlyList<IDomainEvent> GetDomainEvents();
|
||||
Task BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken = default);
|
||||
Task BeginTransactionAsync(CancellationToken cancellationToken = default);
|
||||
Task CommitTransactionAsync(CancellationToken cancellationToken = default);
|
||||
Task RollbackTransactionAsync(CancellationToken cancellationToken = default);
|
||||
Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
@ -19,4 +20,11 @@ public static class ConfigurationExtensions
|
||||
configuration?.GetSection(section).Bind(model);
|
||||
return model;
|
||||
}
|
||||
|
||||
public static TModel GetOptions<TModel>(this WebApplication app, string section) where TModel : new()
|
||||
{
|
||||
var model = new TModel();
|
||||
app.Configuration?.GetSection(section).Bind(model);
|
||||
return model;
|
||||
}
|
||||
}
|
||||
@ -8,7 +8,6 @@ using BuildingBlocks.Jwt;
|
||||
using BuildingBlocks.Logging;
|
||||
using BuildingBlocks.Mapster;
|
||||
using BuildingBlocks.MassTransit;
|
||||
using BuildingBlocks.Mongo;
|
||||
using BuildingBlocks.OpenTelemetry;
|
||||
using BuildingBlocks.Swagger;
|
||||
using BuildingBlocks.Utils;
|
||||
@ -24,49 +23,59 @@ using Microsoft.AspNetCore.Mvc.ApiExplorer;
|
||||
using Prometheus;
|
||||
using Serilog;
|
||||
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
var configuration = builder.Configuration;
|
||||
|
||||
var appOptions = builder.Services.GetOptions<AppOptions>("AppOptions");
|
||||
RegisterServices(builder);
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
ConfigureApplication(app);
|
||||
|
||||
app.Run();
|
||||
|
||||
static void RegisterServices(WebApplicationBuilder builder)
|
||||
{
|
||||
var configuration = builder.Configuration;
|
||||
var services = builder.Services;
|
||||
|
||||
var appOptions = services.GetOptions<AppOptions>("AppOptions");
|
||||
Console.WriteLine(FiggleFonts.Standard.Render(appOptions.Name));
|
||||
|
||||
builder.Services.AddCustomDbContext<FlightDbContext>(configuration, typeof(FlightRoot).Assembly);
|
||||
builder.Services.AddMongoDbContext<FlightReadDbContext>(configuration);
|
||||
|
||||
builder.Services.AddScoped<IDataSeeder, FlightDataSeeder>();
|
||||
builder.AddCustomSerilog();
|
||||
builder.Services.AddJwt();
|
||||
builder.Services.AddControllers();
|
||||
builder.Services.AddCustomSwagger(builder.Configuration, typeof(FlightRoot).Assembly);
|
||||
builder.Services.AddCustomVersioning();
|
||||
builder.Services.AddCustomMediatR();
|
||||
builder.Services.AddValidatorsFromAssembly(typeof(FlightRoot).Assembly);
|
||||
builder.Services.AddCustomProblemDetails();
|
||||
builder.Services.AddCustomMapster(typeof(FlightRoot).Assembly);
|
||||
builder.Services.AddHttpContextAccessor();
|
||||
builder.Services.AddTransient<IEventMapper, EventMapper>();
|
||||
builder.Services.AddCustomMassTransit(typeof(FlightRoot).Assembly);
|
||||
builder.Services.AddCustomOpenTelemetry();
|
||||
builder.Services.AddRouting(options => options.LowercaseUrls = true);
|
||||
|
||||
builder.Services.AddGrpc(options =>
|
||||
services.AddCustomDbContext<FlightDbContext>(configuration, typeof(FlightRoot).Assembly);
|
||||
services.AddScoped<IDataSeeder, FlightDataSeeder>();
|
||||
services.AddJwt();
|
||||
services.AddControllers();
|
||||
services.AddCustomSwagger(builder.Configuration, typeof(FlightRoot).Assembly);
|
||||
services.AddCustomVersioning();
|
||||
services.AddCustomMediatR();
|
||||
services.AddValidatorsFromAssembly(typeof(FlightRoot).Assembly);
|
||||
services.AddCustomProblemDetails();
|
||||
services.AddCustomMapster(typeof(FlightRoot).Assembly);
|
||||
services.AddHttpContextAccessor();
|
||||
services.AddTransient<IEventMapper, EventMapper>();
|
||||
services.AddCustomMassTransit(typeof(FlightRoot).Assembly);
|
||||
services.AddCustomOpenTelemetry();
|
||||
services.AddRouting(options => options.LowercaseUrls = true);
|
||||
|
||||
services.AddGrpc(options =>
|
||||
{
|
||||
options.Interceptors.Add<GrpcExceptionInterceptor>();
|
||||
});
|
||||
|
||||
builder.Services.AddMagicOnion();
|
||||
services.AddMagicOnion();
|
||||
|
||||
SnowFlakIdGenerator.Configure(1);
|
||||
|
||||
builder.Services.AddCachingRequest(new List<Assembly>
|
||||
services.AddCachingRequest(new List<Assembly> {typeof(FlightRoot).Assembly});
|
||||
|
||||
services.AddEasyCaching(options => { options.UseInMemory(configuration, "mem"); });
|
||||
}
|
||||
|
||||
static void ConfigureApplication(WebApplication app)
|
||||
{
|
||||
typeof(FlightRoot).Assembly
|
||||
});
|
||||
|
||||
builder.Services.AddEasyCaching(options => { options.UseInMemory(configuration, "mem"); });
|
||||
|
||||
var app = builder.Build();
|
||||
var appOptions = app.GetOptions<AppOptions>("AppOptions");
|
||||
|
||||
if (app.Environment.IsDevelopment())
|
||||
{
|
||||
@ -84,8 +93,6 @@ app.UseHttpsRedirection();
|
||||
app.UseAuthentication();
|
||||
app.UseAuthorization();
|
||||
|
||||
|
||||
|
||||
app.UseEndpoints(endpoints =>
|
||||
{
|
||||
endpoints.MapControllers();
|
||||
@ -94,8 +101,6 @@ app.UseEndpoints(endpoints =>
|
||||
});
|
||||
|
||||
app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name));
|
||||
app.Run();
|
||||
|
||||
public partial class Program
|
||||
{
|
||||
}
|
||||
|
||||
public partial class Program { }
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
<Folder Include="Aircrafts\Exceptions"/>
|
||||
<Folder Include="Airports\Exceptions"/>
|
||||
<Folder Include="Data\Migrations"/>
|
||||
<Folder Include="Enum"/>
|
||||
<Folder Include="Flights\Features\UpdateFlight"/>
|
||||
<Folder Include="Seats\Features\CreateSeat"/>
|
||||
</ItemGroup>
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using BuildingBlocks.Web;
|
||||
@ -11,13 +12,14 @@ namespace Flight.Flights.Features.GetFlightById;
|
||||
[Route(BaseApiPath + "/flight")]
|
||||
public class GetFlightByIdEndpoint: BaseController
|
||||
{
|
||||
[Authorize]
|
||||
// [Authorize]
|
||||
[HttpGet("{id}")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
[SwaggerOperation(Summary = "Get flight by id", Description = "Get flight by id")]
|
||||
public async Task<ActionResult> GetById([FromRoute] GetFlightByIdQuery query, CancellationToken cancellationToken)
|
||||
{
|
||||
throw new Exception();
|
||||
var result = await Mediator.Send(query, cancellationToken);
|
||||
|
||||
return Ok(result);
|
||||
|
||||
@ -2,14 +2,13 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="6.0.1" />
|
||||
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0"/>
|
||||
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="6.0.4"/>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0"/>
|
||||
<PackageReference Include="xunit" Version="2.4.1"/>
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
|
||||
@ -29,8 +28,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\src\Flight\Flight.csproj" />
|
||||
<ProjectReference Include="..\src\Flight.Api\Flight.Api.csproj"/>
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
</Project>
|
||||
|
||||
@ -1,19 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Security.Claims;
|
||||
using System.Threading.Tasks;
|
||||
using BuildingBlocks.Domain.Model;
|
||||
using Flight.Data;
|
||||
using MediatR;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc.Testing;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.VisualStudio.TestPlatform.TestHost;
|
||||
using Moq;
|
||||
using Respawn;
|
||||
using Xunit;
|
||||
|
||||
@ -24,97 +17,214 @@ public class SliceFixtureCollection : ICollectionFixture<TestFixture>
|
||||
{
|
||||
}
|
||||
|
||||
// ref: https://github.com/jbogard/ContosoUniversityDotNetCore-Pages/blob/master/ContosoUniversity.IntegrationTests/SliceFixture.cs
|
||||
public class TestFixture : IAsyncLifetime
|
||||
{
|
||||
private readonly Checkpoint _checkpoint;
|
||||
private readonly IConfiguration _configuration;
|
||||
private readonly WebApplicationFactory<Program> _factory;
|
||||
private static IServiceScopeFactory _scopeFactory = null!;
|
||||
private readonly IServiceScopeFactory _scopeFactory;
|
||||
|
||||
public TestFixture()
|
||||
{
|
||||
_factory = new FlightTestApplicationFactory();
|
||||
var factory = FlightTestApplicationFactory();
|
||||
|
||||
_configuration = _factory.Services.GetRequiredService<IConfiguration>();
|
||||
_scopeFactory = _factory.Services.GetRequiredService<IServiceScopeFactory>();
|
||||
_configuration = factory.Services.GetRequiredService<IConfiguration>();
|
||||
_scopeFactory = factory.Services.GetRequiredService<IServiceScopeFactory>();
|
||||
|
||||
_checkpoint = new Checkpoint();
|
||||
}
|
||||
|
||||
class FlightTestApplicationFactory : WebApplicationFactory<Program>
|
||||
{
|
||||
protected override void ConfigureWebHost(IWebHostBuilder builder)
|
||||
{
|
||||
// builder.ConfigureAppConfiguration((_, configBuilder) =>
|
||||
// {
|
||||
// configBuilder.AddInMemoryCollection(new Dictionary<string, string>
|
||||
// {
|
||||
// {"ConnectionStrings:DefaultConnection", _connectionString}
|
||||
// });
|
||||
// });
|
||||
|
||||
builder.ConfigureServices(services =>
|
||||
{
|
||||
services.AddLogging();
|
||||
var httpContextAccessorService = services.FirstOrDefault(d =>
|
||||
d.ServiceType == typeof(IHttpContextAccessor));
|
||||
services.Remove(httpContextAccessorService);
|
||||
services.AddSingleton(_ => Mock.Of<IHttpContextAccessor>());
|
||||
|
||||
services.AddSingleton(Mock.Of<IWebHostEnvironment>(w =>
|
||||
w.EnvironmentName == "Flight.IntegrationTest" &&
|
||||
w.ApplicationName == "Flight"));
|
||||
|
||||
// services.AddMassTransitTestHarness();
|
||||
//
|
||||
// // MassTransit Harness Setup -- Do Not Delete Comment
|
||||
// services.AddMassTransitInMemoryTestHarness(cfg =>
|
||||
// {
|
||||
// // Consumer Registration -- Do Not Delete Comment
|
||||
// // cfg.AddConsumer<AddToBook>();
|
||||
// // cfg.AddConsumerTestHarness<AddToBook>();
|
||||
// });
|
||||
|
||||
EnsureDatabase();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static void EnsureDatabase()
|
||||
{
|
||||
using var scope = _scopeFactory.CreateScope();
|
||||
|
||||
var context = scope.ServiceProvider.GetService<FlightDbContext>();
|
||||
|
||||
context?.Database.Migrate();
|
||||
}
|
||||
|
||||
public static TScopedService GetService<TScopedService>()
|
||||
{
|
||||
var scope = _scopeFactory.CreateScope();
|
||||
var service = scope.ServiceProvider.GetService<TScopedService>();
|
||||
return service;
|
||||
}
|
||||
|
||||
|
||||
public static Task<TResponse> SendAsync<TResponse>(IRequest<TResponse> request)
|
||||
{
|
||||
using var scope = _scopeFactory.CreateScope();
|
||||
|
||||
var mediator = scope.ServiceProvider.GetService<ISender>();
|
||||
|
||||
return mediator.Send(request);
|
||||
}
|
||||
|
||||
|
||||
public Task InitializeAsync()
|
||||
=> _checkpoint.Reset(_configuration.GetConnectionString("FlightConnection"));
|
||||
{
|
||||
return _checkpoint.Reset(_configuration.GetConnectionString("DefaultConnection"));
|
||||
}
|
||||
|
||||
public Task DisposeAsync()
|
||||
{
|
||||
_factory?.Dispose();
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public WebApplicationFactory<Program> FlightTestApplicationFactory()
|
||||
{
|
||||
return new WebApplicationFactory<Program>()
|
||||
.WithWebHostBuilder(builder =>
|
||||
{
|
||||
builder.ConfigureAppConfiguration((_, configBuilder) =>
|
||||
{
|
||||
configBuilder.AddInMemoryCollection(new Dictionary<string, string>
|
||||
{
|
||||
{
|
||||
"ConnectionStrings:DefaultConnection",
|
||||
"Server=db;Database=FlightDB;User ID=sa;Password=@Aa123456"
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
public async Task ExecuteScopeAsync(Func<IServiceProvider, Task> action)
|
||||
{
|
||||
using var scope = _scopeFactory.CreateScope();
|
||||
var dbContext = scope.ServiceProvider.GetRequiredService<FlightDbContext>();
|
||||
|
||||
try
|
||||
{
|
||||
await dbContext.BeginTransactionAsync();
|
||||
|
||||
await action(scope.ServiceProvider);
|
||||
|
||||
await dbContext.CommitTransactionAsync();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
await dbContext.RollbackTransactionAsync();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<T> ExecuteScopeAsync<T>(Func<IServiceProvider, Task<T>> action)
|
||||
{
|
||||
using var scope = _scopeFactory.CreateScope();
|
||||
var dbContext = scope.ServiceProvider.GetRequiredService<FlightDbContext>();
|
||||
|
||||
try
|
||||
{
|
||||
await dbContext.BeginTransactionAsync();
|
||||
|
||||
var result = await action(scope.ServiceProvider);
|
||||
|
||||
await dbContext.CommitTransactionAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
await dbContext.RollbackTransactionAsync();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public Task ExecuteDbContextAsync(Func<FlightDbContext, Task> action)
|
||||
{
|
||||
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>()));
|
||||
}
|
||||
|
||||
public Task ExecuteDbContextAsync(Func<FlightDbContext, ValueTask> action)
|
||||
{
|
||||
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>()).AsTask());
|
||||
}
|
||||
|
||||
public Task ExecuteDbContextAsync(Func<FlightDbContext, IMediator, Task> action)
|
||||
{
|
||||
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>(), sp.GetService<IMediator>()));
|
||||
}
|
||||
|
||||
public Task<T> ExecuteDbContextAsync<T>(Func<FlightDbContext, Task<T>> action)
|
||||
{
|
||||
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>()));
|
||||
}
|
||||
|
||||
public Task<T> ExecuteDbContextAsync<T>(Func<FlightDbContext, ValueTask<T>> action)
|
||||
{
|
||||
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>()).AsTask());
|
||||
}
|
||||
|
||||
public Task<T> ExecuteDbContextAsync<T>(Func<FlightDbContext, IMediator, Task<T>> action)
|
||||
{
|
||||
return ExecuteScopeAsync(sp => action(sp.GetService<FlightDbContext>(), sp.GetService<IMediator>()));
|
||||
}
|
||||
|
||||
public Task InsertAsync<T>(params T[] entities) where T : class
|
||||
{
|
||||
return ExecuteDbContextAsync(db =>
|
||||
{
|
||||
foreach (var entity in entities) db.Set<T>().Add(entity);
|
||||
return db.SaveChangesAsync();
|
||||
});
|
||||
}
|
||||
|
||||
public Task InsertAsync<TEntity>(TEntity entity) where TEntity : class
|
||||
{
|
||||
return ExecuteDbContextAsync(db =>
|
||||
{
|
||||
db.Set<TEntity>().Add(entity);
|
||||
|
||||
return db.SaveChangesAsync();
|
||||
});
|
||||
}
|
||||
|
||||
public Task InsertAsync<TEntity, TEntity2>(TEntity entity, TEntity2 entity2)
|
||||
where TEntity : class
|
||||
where TEntity2 : class
|
||||
{
|
||||
return ExecuteDbContextAsync(db =>
|
||||
{
|
||||
db.Set<TEntity>().Add(entity);
|
||||
db.Set<TEntity2>().Add(entity2);
|
||||
|
||||
return db.SaveChangesAsync();
|
||||
});
|
||||
}
|
||||
|
||||
public Task InsertAsync<TEntity, TEntity2, TEntity3>(TEntity entity, TEntity2 entity2, TEntity3 entity3)
|
||||
where TEntity : class
|
||||
where TEntity2 : class
|
||||
where TEntity3 : class
|
||||
{
|
||||
return ExecuteDbContextAsync(db =>
|
||||
{
|
||||
db.Set<TEntity>().Add(entity);
|
||||
db.Set<TEntity2>().Add(entity2);
|
||||
db.Set<TEntity3>().Add(entity3);
|
||||
|
||||
return db.SaveChangesAsync();
|
||||
});
|
||||
}
|
||||
|
||||
public Task InsertAsync<TEntity, TEntity2, TEntity3, TEntity4>(TEntity entity, TEntity2 entity2, TEntity3 entity3,
|
||||
TEntity4 entity4)
|
||||
where TEntity : class
|
||||
where TEntity2 : class
|
||||
where TEntity3 : class
|
||||
where TEntity4 : class
|
||||
{
|
||||
return ExecuteDbContextAsync(db =>
|
||||
{
|
||||
db.Set<TEntity>().Add(entity);
|
||||
db.Set<TEntity2>().Add(entity2);
|
||||
db.Set<TEntity3>().Add(entity3);
|
||||
db.Set<TEntity4>().Add(entity4);
|
||||
|
||||
return db.SaveChangesAsync();
|
||||
});
|
||||
}
|
||||
|
||||
public Task<T> FindAsync<T>(int id)
|
||||
where T : class, IEntity
|
||||
{
|
||||
return ExecuteDbContextAsync(db => db.Set<T>().FindAsync(id).AsTask());
|
||||
}
|
||||
|
||||
public Task<TResponse> SendAsync<TResponse>(IRequest<TResponse> request)
|
||||
{
|
||||
return ExecuteScopeAsync(sp =>
|
||||
{
|
||||
var mediator = sp.GetRequiredService<IMediator>();
|
||||
|
||||
return mediator.Send(request);
|
||||
});
|
||||
}
|
||||
|
||||
public Task SendAsync(IRequest request)
|
||||
{
|
||||
return ExecuteScopeAsync(sp =>
|
||||
{
|
||||
var mediator = sp.GetRequiredService<IMediator>();
|
||||
|
||||
return mediator.Send(request);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -1 +1,9 @@
|
||||
{"Version":1,"Id":"31079AE9DF4ED1F2D492E52BA5A644F5","Created":"2022-04-18T20:26:55.3256244Z","Algorithm":"RS256","IsX509Certificate":false,"Data":"CfDJ8P3RLEnEd5JHjUIOTYyyJAzVTUgXKNFkjwfEWELe3r9iozJI4zF_jAjqORPS_C37DAQiHHtMYbgB7_j1Wwqck7qb_wv8CuDfNW8Hx0_UdWaO6vD0Sf_hIbBmN4RrwFwdMia8IUcNCUpwL9XJl95TLzD9FjpuyuWElQ8_5ZnF3SuErstPenQa4q9MYsj9XmPhNSk-BQan-cimxIAPYm1BgZNm5DMylT98sus9ScYTgOowV2n13MW0uA7kk9JOZIIjG07UuaSnuEQei03AU9zkejYD8yLwBi98ON5s0_jW2V3ebY-01VBQXhztu5Iev_SCynNyqQW-uqEzL9SSlzX8dEa79KKmOJEo2o325AVeDOBvco2XDCCra5RkRhUIPV3ZHvQr4EZJNqvi1zelWs3-FJ9vXE02-6XZkZKd6TzhPfiMDc1Z88-eVlx-uwhPjvJyfUSU9cAgbNDREDETxUcmIAMqqbXVAUCnaPkpbxy0VZ6YGSNsD9w77L6nIKiz-0KkVtxDZKCXh5BbDwAiWza8KWKclnVUnMLGhnjANEgKzzvmb1UJr1wZ0xRZ9KXyxr9oy0kP1Be-ysFSUd-YUTSgDvuQZV_DPjH2XP99tXqmfWJ8PJN9hswaRGhp5Jxo003l93u7Ivy-XR1BEhxVoYpvV9fCh8lo-N9ayHYpYlEsdArk1qvkuGRSlkBWNeEr_ZsvODbwM8Jp5q7pLK7cUy0bRHnYwkyHReS_fh6_tTdnfcQZPWb7fLN967XwebcVNOEENn5FX9oszCiy5BG9HQDIPffIx8bkKrZCMV77e5Qria9wNwkhIi3-7SOjRD-v5azkwiV0hTToAQTYsAT8DRTJklI90PF4JbsiMvObeoJtbwPy3E-K1_4DOxAjNwQFHf_zqWEbo9vmxGF-IerSwaJNSVfUUxnnYT8JWFYHYzWGyMvqtdymk1pmBaOJ64dgTVVcao7S0PwfV4DNUzxKQX-jNzqMihaXu4y8lyGIPJycJezm7nfGJiHhhhV4EWSQ1Y2ypBGv_s1iZ5pvTCeGkthY2Q4pe-GYKrFGTnBSLWwHqsVA2gwb1McjYjUGNgu_mnzyB45ZpKrqXQDDiozbQ4Ju7DJb5Vi_EoPmeHQDj5h5sFwAWtq0NGI_lRAog2K_QnZvSV3SFDVlaKDq9PjgIORc6wi5bzbAusWbjDd_sb211QsrNfW-0SWWgYwz9qRg14OiuntGESXSq9Cmx8WgPaK5H0FQGZUlzq3Bk8ov6GUhPeZSKP4gUyfRloSyj2DBZSe_0JOXO3e4Q6BFZLqhpStyAxoUZftEW_J3pKNjCrvKCOm-Taz0EVBEH9zqLTJwwXEoR86YYNTrtpARTOHo2qco_oMSX_2O4cpAfDZz0ZMHuqxunNnannVdFv5SdAHXngHLguLwAVuUTGlrg_xnUeW4Msi9-CKXpmmEQv6BCIW8Q4S5rn0vp394QgMCCo4473jOEeOX1G4_CUOhJZydGOCEbC5cMrM_54SKBu7hz8P9MCkDLj1ZsPwPDB1YyDwLFJlxb9oEZoRC4whvTJAfX2xNP4wv73ojxwrOII2ivNrnqNX6EM41bxmqMrF9tltSut-OR2XHO-DdJduoRnJjmKJl_WaZQypbZqfVepURuDNGChqyby--xsGMA-yQBBrVigXSKliuYG7dxWBp3TJFrvD4Aym1gAQOgjlObIHknv1cA83g_rHx6vq7JfwqMFYu6H6IZ6eeTUde1IixstE7EzU_4u5LzkQb8HKSMt3j9m3dlH4OigcPvcSJy8aJoN-UCFInfnE7IX0ul_S5HAgvgLM_BEVa3KTa0u8nxAY7xaIXrwWJZ23fhiZrOkNYJI1XAiN11sjtVgVS8viZCkTabUtpEtX2nPe767IbwVzPdOG-C6W_-8uNN_j1WjYeQfsSjmAjab2jZqx3BCDOjTbHkP_vKSzdABFA6bu2Fqt3io2UVTYq-a_Jf2b4JGmuiHomXjhsH3KZp_MDw1nZ8zf1mejyuH_NHFScVzb-vO_ieZ-RDQZn32VPaaDlylSMGa4kE9-54tHZUkFR4Jy1vpyKjXBa3uIEQBE5RFn7XCKbVA4Ea9BCou5ku7E6Zod0SfjMmmknB6jzLTVSBgMP2AkFb98m943O1XXsDQstMmTZdqmNJTOirLoL2Vu1AXqsdS7O-DrVcDImR7ekSGPhUSg2LQkObRPT26sSeiygKlNDi3PktIA1duuJ066NoIHCJupl2mugbFDrZ90SBaQ9n72Ya7fjKdrSdp3izCxqlldeZPANZMMZ5KwjX9WZnl-lPNsn3iCNaEhBCqSWne7YN6xxRS6gKoMobVav-HsZ841qr5iaYzDFD2kA4R35A-Dm5zJyfSCV4NPdUEGzIIbjg1-kYv8PFR_kImuXIwGXT86BxpgEY6PRaD8-ZFZMzerGvEhS8R39NpQ-hiZ_P_ZY3wamWHlwttaTvX3fqpflHlhKV_9AI9HZ","DataProtected":true}
|
||||
{
|
||||
"Version": 1,
|
||||
"Id": "31079AE9DF4ED1F2D492E52BA5A644F5",
|
||||
"Created": "2022-04-18T20:26:55.3256244Z",
|
||||
"Algorithm": "RS256",
|
||||
"IsX509Certificate": false,
|
||||
"Data": "CfDJ8P3RLEnEd5JHjUIOTYyyJAzVTUgXKNFkjwfEWELe3r9iozJI4zF_jAjqORPS_C37DAQiHHtMYbgB7_j1Wwqck7qb_wv8CuDfNW8Hx0_UdWaO6vD0Sf_hIbBmN4RrwFwdMia8IUcNCUpwL9XJl95TLzD9FjpuyuWElQ8_5ZnF3SuErstPenQa4q9MYsj9XmPhNSk-BQan-cimxIAPYm1BgZNm5DMylT98sus9ScYTgOowV2n13MW0uA7kk9JOZIIjG07UuaSnuEQei03AU9zkejYD8yLwBi98ON5s0_jW2V3ebY-01VBQXhztu5Iev_SCynNyqQW-uqEzL9SSlzX8dEa79KKmOJEo2o325AVeDOBvco2XDCCra5RkRhUIPV3ZHvQr4EZJNqvi1zelWs3-FJ9vXE02-6XZkZKd6TzhPfiMDc1Z88-eVlx-uwhPjvJyfUSU9cAgbNDREDETxUcmIAMqqbXVAUCnaPkpbxy0VZ6YGSNsD9w77L6nIKiz-0KkVtxDZKCXh5BbDwAiWza8KWKclnVUnMLGhnjANEgKzzvmb1UJr1wZ0xRZ9KXyxr9oy0kP1Be-ysFSUd-YUTSgDvuQZV_DPjH2XP99tXqmfWJ8PJN9hswaRGhp5Jxo003l93u7Ivy-XR1BEhxVoYpvV9fCh8lo-N9ayHYpYlEsdArk1qvkuGRSlkBWNeEr_ZsvODbwM8Jp5q7pLK7cUy0bRHnYwkyHReS_fh6_tTdnfcQZPWb7fLN967XwebcVNOEENn5FX9oszCiy5BG9HQDIPffIx8bkKrZCMV77e5Qria9wNwkhIi3-7SOjRD-v5azkwiV0hTToAQTYsAT8DRTJklI90PF4JbsiMvObeoJtbwPy3E-K1_4DOxAjNwQFHf_zqWEbo9vmxGF-IerSwaJNSVfUUxnnYT8JWFYHYzWGyMvqtdymk1pmBaOJ64dgTVVcao7S0PwfV4DNUzxKQX-jNzqMihaXu4y8lyGIPJycJezm7nfGJiHhhhV4EWSQ1Y2ypBGv_s1iZ5pvTCeGkthY2Q4pe-GYKrFGTnBSLWwHqsVA2gwb1McjYjUGNgu_mnzyB45ZpKrqXQDDiozbQ4Ju7DJb5Vi_EoPmeHQDj5h5sFwAWtq0NGI_lRAog2K_QnZvSV3SFDVlaKDq9PjgIORc6wi5bzbAusWbjDd_sb211QsrNfW-0SWWgYwz9qRg14OiuntGESXSq9Cmx8WgPaK5H0FQGZUlzq3Bk8ov6GUhPeZSKP4gUyfRloSyj2DBZSe_0JOXO3e4Q6BFZLqhpStyAxoUZftEW_J3pKNjCrvKCOm-Taz0EVBEH9zqLTJwwXEoR86YYNTrtpARTOHo2qco_oMSX_2O4cpAfDZz0ZMHuqxunNnannVdFv5SdAHXngHLguLwAVuUTGlrg_xnUeW4Msi9-CKXpmmEQv6BCIW8Q4S5rn0vp394QgMCCo4473jOEeOX1G4_CUOhJZydGOCEbC5cMrM_54SKBu7hz8P9MCkDLj1ZsPwPDB1YyDwLFJlxb9oEZoRC4whvTJAfX2xNP4wv73ojxwrOII2ivNrnqNX6EM41bxmqMrF9tltSut-OR2XHO-DdJduoRnJjmKJl_WaZQypbZqfVepURuDNGChqyby--xsGMA-yQBBrVigXSKliuYG7dxWBp3TJFrvD4Aym1gAQOgjlObIHknv1cA83g_rHx6vq7JfwqMFYu6H6IZ6eeTUde1IixstE7EzU_4u5LzkQb8HKSMt3j9m3dlH4OigcPvcSJy8aJoN-UCFInfnE7IX0ul_S5HAgvgLM_BEVa3KTa0u8nxAY7xaIXrwWJZ23fhiZrOkNYJI1XAiN11sjtVgVS8viZCkTabUtpEtX2nPe767IbwVzPdOG-C6W_-8uNN_j1WjYeQfsSjmAjab2jZqx3BCDOjTbHkP_vKSzdABFA6bu2Fqt3io2UVTYq-a_Jf2b4JGmuiHomXjhsH3KZp_MDw1nZ8zf1mejyuH_NHFScVzb-vO_ieZ-RDQZn32VPaaDlylSMGa4kE9-54tHZUkFR4Jy1vpyKjXBa3uIEQBE5RFn7XCKbVA4Ea9BCou5ku7E6Zod0SfjMmmknB6jzLTVSBgMP2AkFb98m943O1XXsDQstMmTZdqmNJTOirLoL2Vu1AXqsdS7O-DrVcDImR7ekSGPhUSg2LQkObRPT26sSeiygKlNDi3PktIA1duuJ066NoIHCJupl2mugbFDrZ90SBaQ9n72Ya7fjKdrSdp3izCxqlldeZPANZMMZ5KwjX9WZnl-lPNsn3iCNaEhBCqSWne7YN6xxRS6gKoMobVav-HsZ841qr5iaYzDFD2kA4R35A-Dm5zJyfSCV4NPdUEGzIIbjg1-kYv8PFR_kImuXIwGXT86BxpgEY6PRaD8-ZFZMzerGvEhS8R39NpQ-hiZ_P_ZY3wamWHlwttaTvX3fqpflHlhKV_9AI9HZ",
|
||||
"DataProtected": true
|
||||
}
|
||||
|
||||
@ -1 +1,9 @@
|
||||
{"Version":1,"Id":"74ABBD16A9EF6567607D1F748BB91597","Created":"2022-03-29T20:44:37.9948898Z","Algorithm":"RS256","IsX509Certificate":false,"Data":"CfDJ8P3RLEnEd5JHjUIOTYyyJAzeYir0LDVxp1O__t0rzDUFxCBt5XtK6FK6fLgopH3OcjrMTbORu_DJp3lf4bf015LKnOk0yjzfzZ5xRX3qwHwz1jvdXKqzt-Pf85kiRlrNv6qiTH7UXP5xGTY3Tn7TdkVJfPmvfHtQyw1FhIPJnx5KQ469H2DRnoxmpwpspHrGlrPA5cJn3Uc7xFnTNEe0laORnilL1rxTTsKFFhJCWCcoxMozgh_SQqEhy9B7Vb4rQHn-ULb8qO4IaKDvbuCJNuGD2nJxy5lBNkdFKJD724IlGIB1nV3w5LR3YVYcxxIc1bLrbK3byHbVHsl8i9uacpN4-JP2Z16Sku9jhsQ21d1tNssE7gmxe8u6qE4RQjL2URSci8_XdSsRa0DBYNaVOSLv60M4dtwg6pJeWB6GfvJ8_JFnTDFDs51rXc77RL4tANblHLzuQl2C3gMMbJPoviWSs8R0hg2mCp0-pQWwSzNvNmtWwsMNXPgHtfIrJTGDKTQEiYIkvkf34gsBaweyea3Q5H2prmt10qVHr47LpkjGqxpHvi9eboJQkG2y-1MBptNpdiYZ4gbViplu8Ru5M4YsCmb0zZF2Q1DZsKVM-T_PFZCgyy1LjLwSHczvcflQh__6YmSwhehI7Nka86m3lK80nwAr9u0qoUyqjavte-XjNiRbUd7MHaEy2bT_jj40oqdh6sGURIkmmJljxPQfu7Scqgcs6chQSY4JXEnfLBa0AK40mefPwpk76QOJBQRBJ3PvnSLc5RMhgs2c2Vc54j4VuQU0tjiHoDPcgerj5oRIQCDiA2_ylleNmxBEomENO0FRortejvV7FNb2qzTfey1r6bTwJvN81EFfMhGUCsj7X0KkBywJMESsQlU3pbs_JChQfX-6rMjofkMYEtnupYnCutUFVO-xZoXrJvw5AOxtJn4JoPHBYeEhC29zjHvtzfSnnnDzCQxiJkWO6pyuAFVIyJUK50Bx_yuaiDicscEjShfd-fQEN_l3eFsUzTGa5rX9gfsPckH8jkpkFkXJlUKFt-nt_9FDnqi5WM6Hf_d891jocGkgiSLM2YURz5Fkyq8S6o-hrBnVf4Pz4dtfsQBw-NnOAl4FPnaknsVdDLZ-qe9gaZdN3wbHQMwFq2eTmm36M6ky47A2xO8MksDSlh4ROcrqJZOBaCWE6fFowcot1sJXFAqNw5iuEKNmtFtJU6oPWxTGY5C0BdjExksQZzqmg2JkjbqZE0zRBFBs0oSJHZsQTnBZmTELIUzMjZVO5eXfVp0tBoOWoW0KgTdHEhlHhNXkvZDoNIdQKu7RVEmhF3AmWWUYzpAW1Y_oEPAsF1Jf-msAlCiMnchbg3yxDG7n6VKAPssQQs3RGPjPLCjOKtHtK4X_3ivVvHbX0xxZhUk44DBv8HDd72rQLEenrXKuIEr_L6VzZ93BpisnxMWxJV6pRcYe1LTtu4nQGZ20hiJs98zHRHomwWJFqxIlPZrSrqTrxUAN4jCl4WSLgf-c2zRfO3AHqvlVCt518s92IUx75372znyoM7-xB5h95T2yxg9x9dlY-_-wICdlyPiQ8arAQ824Cl_2QkSU_ba30gAvWlXGYRVFpg3PSmP0mIhq-ffA8HLB0ARZfYl1_vMspd9kbPyJVCRSaFObC_L-AwvKV8f7Oqqd6bwbUYvdA_6cw1gFUeiqH2wuggOjFI3WDp-5ttVdmZnDVDK--LR3y5b2cYHAf3EG2N-7qMBwZqpOb3ivnRFX_SUlB9V9BlvSe_sLU5zJphBoSWm2-_4j9rWQjCaswlBLbScRA3r1KC5BFxFgbFFv7p4hWk_xjdAx5q4RHM6wqFfGj1WkrjRtdnMC7z1ZM7Bdsno-5yt6PQBP-y4QIvpSpefXl8E4_gBJ6dzToQwLS_Tpk7CjzlIV3oUZ5XfMV0s14Flky6ErsvBdXMzNbHwvxwCAoxbYDrjZ9U-w9gibGOOVBYmKjhkeGLGs8ejqc8TxrzEEFL1li1ZfXxeNAcu4zyNwTHsWaaLVciWaw-UuPqA4uDFxMNmxI6kfXa49L0voFkQaeMo48J2lVjH00QV8f-nXnVaZFztiTU7fYYlpK-RxRSL1q0qQOFMEKOdltqqKxKbM7grNSoBQz-ZHqQq7ZR4v7NRl-yyTGmcGvOzTaDfLP9snbDfiU2QnqH-S2pgtobbYJ_UZvGfg8AZurvNBbl-KuBOrN3yarxe5STJY9mHY_8y2c8C_foQifRSNr_oDANvMbfsukrV8HJimtMk9WF15Qaz51BCiZ9NIxiCsgaJHZ48Oi8EUput8rtTInjNjAvb33N4whgDKQVLWXE59k13dlZX7xA1V-pFbY9TvFLFsWwWS6Jrj8okejPb5Fsb9zraapVTTCIEr3VYR9BB_V7tgkldqpNatO6_qqczD4owmZ-dL6IDyE4f2u_2FCgUV1FP30UMdkRmKHAbhZ9kGCK-ZI5XS33qh","DataProtected":true}
|
||||
{
|
||||
"Version": 1,
|
||||
"Id": "74ABBD16A9EF6567607D1F748BB91597",
|
||||
"Created": "2022-03-29T20:44:37.9948898Z",
|
||||
"Algorithm": "RS256",
|
||||
"IsX509Certificate": false,
|
||||
"Data": "CfDJ8P3RLEnEd5JHjUIOTYyyJAzeYir0LDVxp1O__t0rzDUFxCBt5XtK6FK6fLgopH3OcjrMTbORu_DJp3lf4bf015LKnOk0yjzfzZ5xRX3qwHwz1jvdXKqzt-Pf85kiRlrNv6qiTH7UXP5xGTY3Tn7TdkVJfPmvfHtQyw1FhIPJnx5KQ469H2DRnoxmpwpspHrGlrPA5cJn3Uc7xFnTNEe0laORnilL1rxTTsKFFhJCWCcoxMozgh_SQqEhy9B7Vb4rQHn-ULb8qO4IaKDvbuCJNuGD2nJxy5lBNkdFKJD724IlGIB1nV3w5LR3YVYcxxIc1bLrbK3byHbVHsl8i9uacpN4-JP2Z16Sku9jhsQ21d1tNssE7gmxe8u6qE4RQjL2URSci8_XdSsRa0DBYNaVOSLv60M4dtwg6pJeWB6GfvJ8_JFnTDFDs51rXc77RL4tANblHLzuQl2C3gMMbJPoviWSs8R0hg2mCp0-pQWwSzNvNmtWwsMNXPgHtfIrJTGDKTQEiYIkvkf34gsBaweyea3Q5H2prmt10qVHr47LpkjGqxpHvi9eboJQkG2y-1MBptNpdiYZ4gbViplu8Ru5M4YsCmb0zZF2Q1DZsKVM-T_PFZCgyy1LjLwSHczvcflQh__6YmSwhehI7Nka86m3lK80nwAr9u0qoUyqjavte-XjNiRbUd7MHaEy2bT_jj40oqdh6sGURIkmmJljxPQfu7Scqgcs6chQSY4JXEnfLBa0AK40mefPwpk76QOJBQRBJ3PvnSLc5RMhgs2c2Vc54j4VuQU0tjiHoDPcgerj5oRIQCDiA2_ylleNmxBEomENO0FRortejvV7FNb2qzTfey1r6bTwJvN81EFfMhGUCsj7X0KkBywJMESsQlU3pbs_JChQfX-6rMjofkMYEtnupYnCutUFVO-xZoXrJvw5AOxtJn4JoPHBYeEhC29zjHvtzfSnnnDzCQxiJkWO6pyuAFVIyJUK50Bx_yuaiDicscEjShfd-fQEN_l3eFsUzTGa5rX9gfsPckH8jkpkFkXJlUKFt-nt_9FDnqi5WM6Hf_d891jocGkgiSLM2YURz5Fkyq8S6o-hrBnVf4Pz4dtfsQBw-NnOAl4FPnaknsVdDLZ-qe9gaZdN3wbHQMwFq2eTmm36M6ky47A2xO8MksDSlh4ROcrqJZOBaCWE6fFowcot1sJXFAqNw5iuEKNmtFtJU6oPWxTGY5C0BdjExksQZzqmg2JkjbqZE0zRBFBs0oSJHZsQTnBZmTELIUzMjZVO5eXfVp0tBoOWoW0KgTdHEhlHhNXkvZDoNIdQKu7RVEmhF3AmWWUYzpAW1Y_oEPAsF1Jf-msAlCiMnchbg3yxDG7n6VKAPssQQs3RGPjPLCjOKtHtK4X_3ivVvHbX0xxZhUk44DBv8HDd72rQLEenrXKuIEr_L6VzZ93BpisnxMWxJV6pRcYe1LTtu4nQGZ20hiJs98zHRHomwWJFqxIlPZrSrqTrxUAN4jCl4WSLgf-c2zRfO3AHqvlVCt518s92IUx75372znyoM7-xB5h95T2yxg9x9dlY-_-wICdlyPiQ8arAQ824Cl_2QkSU_ba30gAvWlXGYRVFpg3PSmP0mIhq-ffA8HLB0ARZfYl1_vMspd9kbPyJVCRSaFObC_L-AwvKV8f7Oqqd6bwbUYvdA_6cw1gFUeiqH2wuggOjFI3WDp-5ttVdmZnDVDK--LR3y5b2cYHAf3EG2N-7qMBwZqpOb3ivnRFX_SUlB9V9BlvSe_sLU5zJphBoSWm2-_4j9rWQjCaswlBLbScRA3r1KC5BFxFgbFFv7p4hWk_xjdAx5q4RHM6wqFfGj1WkrjRtdnMC7z1ZM7Bdsno-5yt6PQBP-y4QIvpSpefXl8E4_gBJ6dzToQwLS_Tpk7CjzlIV3oUZ5XfMV0s14Flky6ErsvBdXMzNbHwvxwCAoxbYDrjZ9U-w9gibGOOVBYmKjhkeGLGs8ejqc8TxrzEEFL1li1ZfXxeNAcu4zyNwTHsWaaLVciWaw-UuPqA4uDFxMNmxI6kfXa49L0voFkQaeMo48J2lVjH00QV8f-nXnVaZFztiTU7fYYlpK-RxRSL1q0qQOFMEKOdltqqKxKbM7grNSoBQz-ZHqQq7ZR4v7NRl-yyTGmcGvOzTaDfLP9snbDfiU2QnqH-S2pgtobbYJ_UZvGfg8AZurvNBbl-KuBOrN3yarxe5STJY9mHY_8y2c8C_foQifRSNr_oDANvMbfsukrV8HJimtMk9WF15Qaz51BCiZ9NIxiCsgaJHZ48Oi8EUput8rtTInjNjAvb33N4whgDKQVLWXE59k13dlZX7xA1V-pFbY9TvFLFsWwWS6Jrj8okejPb5Fsb9zraapVTTCIEr3VYR9BB_V7tgkldqpNatO6_qqczD4owmZ-dL6IDyE4f2u_2FCgUV1FP30UMdkRmKHAbhZ9kGCK-ZI5XS33qh",
|
||||
"DataProtected": true
|
||||
}
|
||||
|
||||
@ -1 +1,9 @@
|
||||
{"Version":1,"Id":"9258A527F8A78F2F47D30E7F145FD59F","Created":"2022-02-15T09:58:48.5269984Z","Algorithm":"RS256","IsX509Certificate":false,"Data":"CfDJ8HYLA_44KBlEtnKYw5Y6NgZcbR_xFrM2Jsvq7lBG7H9pe38jngLl4EUknvBtq5hxuuwWtTX5qnwK_90h5-sbgF98Tio47qnnv-wA50LawMrDvcEbWMjdBXeFD4hE4QCSCi43i3oRms09g1c6gHipjTOTGmZ0Tj6wGAJZHkdJz6uBuvnWkuypYjaZG1vap_baLugSmjP71PUzn7jgFR1dQDEOcZE91-dERlCPeU7RXdDOTrUJMjD4yvfXO3VdB53YiZErMIgCv7rx1qZhzBPmyg2Z3XK86kY877HD4I-DOerJKeqPYl9vfVmFQgRRLFdOhi5ZpmUwJaRKG0zjTDDfOuvFG16WNPCrr3-_AIU3ANaCvL4Lg44t2lamlRaKlEvT5aKxphO2cVZjSWsTPJMHgHXWYM01e09i3WDbL07g35vJWsnRrrhxhiMoVJJG68-WrZVtev47fT69of6Z5_lhFcc7donENuxlN3K2V8P90Nkxu4eYbHwp267IvadONcgCMO_wHdKwZZswFUs5HYVyYVOZKtmE2T4I7JJWrOeL2iM_VWSFwkwV0hCLQyKazQZwVIe8s2s3glYY8ektc36reTZoSg4ykhanq26OLX4VKw9UzvfyV_J-EozNh2WXlhtgGqoeomjVrNp6U612ywre3QLN-lvSDjd2MoQsZ-CG4S6kyTuXNT0KxsdXs-hXUlXRNbri8fshIjSkYjCVWUKvNFvn7IMJ5AxYakWekKdPL7r75Q7HNJMMYxt8jh7fv7N8QKWuOnWWy_kA8N6qXIsHsetBeBfGBHbq92mQkfcdArVKuysqTzSy2wm9t4mLNFbzO1QPAQ9VS6aYS3DcWh2NF_pc2xlRCRt9Mb1P9IYEUQk7P2iakeYUhKH1MMNh0GuMwkCIaed4XCTEVZfSB70YtPUCawgNFP9hn5ENUVNRWBf6717gT1ioybimXghodrCOHiYxxQDDpss3e8MIl_x-BaqW8C2zYFd6xE0pVFXV5-X7O6XP2sc3ClOd1EyVnLRT1-87Uof-1KYA2kzTyPfWrnC72maTbOJzeje2f6oT98BfsgkvakOAchAkEl_FJz_Dv_KdJ9ZwC9Xv0Wan4dvSS5aR35iifXptuZ0du0pc2t6_CoHGLZxOG6SvXm7AN24XYFcWnRPvGUS2M5NG4pHJn73vOPaon1SAIBUrLiDXSWeW_27G_5UG5P1lPXYecFMjVG2vdKPEDxygu3yj1e5CDyeVmvcnI3-Hl_4skomLB14as8U950O7fr-CuS_BAli6m0mplgAPCOrfeyq_o-xWdM9vNoaEHRGA5e2ZfEIknCinSY7CuoGCnMmR0O8eT2P3aQ34TKHRRspvCVs8GAyzCZaVT8_ZeOHCl4FU8Ac5NIe3OMRPuZs1uJaBfBIVlPP9MfhKgEA_S5t8vfa3RJhiU0jMy5h9OToqnBOQsiIkY0mjSMsn3VvsqeNutK5DKoTpATX822sSHCSYXAewk7F-agvqKnM_cPVhib9Z1r0UXLS2neLZwF5ob7uI1nYU8TNb6cawcWPGBz9FoMjtxXsMsAci5luEVg1ZfGTU9kShAa3sdfRYC5E4L37_Fy_4EZyNEKEMPxx8I20PCPfqEPR_JB0geDv0Up9ZfD2ZwgwovYDVbGv3qIbgbkEH2Z7zf2e4gH9sZClvei1XigDL9gjfJ0b9IdA3QpWw6b3uleR-WbNWag5S2Phz6kPB2irBgoN7oG_gUegXQTzCif0mgeQSwbea1vXOngXBLG1PiyRk_iPKPhZMmg1UoMeqXQlXqDL4VFRnMOsYdOKr-BWsgdCM9zE3CCyVueBX0zTuZU0kM0P8hUH9RsZYdqPOXS0d4Fy0YUmQZTHWwSMbCUG1XmJ4QN3y1FKUKBvRRHZmZboYHz5EKFMHhAbk9ZHZRCpLm4hIlH81IiSgRlYm3CacJqjlAiLp0Tc0zF6oFlZFipA-nM5znhgDJMSV-CSW1FSDvYFvHolOxR4U0hlw_XG6NeytrkiAR7-wvU3ufkslsWowtcyswCNHcT7eg-tpptSXyT0RJaQhWwAc9L9lYWZnCBwknUCak23u1V7jM8ZldOM5jiQrjRvEBv-sqMto4Qo6129AatIKri04PYD9VlHzLP76KY4F-UHUcu-9g3cJp9mnbnzhmD1LvNPQmH2giY0pc9hFWW6_Ablz7GmW2cngb9xwHAgi-WBSrZYoW6l2dAdkm72ECwWmMguwT6OZdaZZzjBYixHKM-mnb4uzVT6CU-pp4-G9dYtX5EPqhKcmsmwbV6qiziV61rGYypP37spT8H_SWTFmqD-sMPg6jJj1PncSFd2mlZFBkuFJDvF6Aorf35t9-rePPRc18k14Poa8J8j_mYVJo3lEIrtRDLF3d8EvZ9UEjmgBj25gSiYhOJBPriRop1qmlVVSUjoTBIJaXlTXefbcZTqc8vguzQ5Oy8rjzTaxeP1-OgsCDO0xw7ibWEeN","DataProtected":true}
|
||||
{
|
||||
"Version": 1,
|
||||
"Id": "9258A527F8A78F2F47D30E7F145FD59F",
|
||||
"Created": "2022-02-15T09:58:48.5269984Z",
|
||||
"Algorithm": "RS256",
|
||||
"IsX509Certificate": false,
|
||||
"Data": "CfDJ8HYLA_44KBlEtnKYw5Y6NgZcbR_xFrM2Jsvq7lBG7H9pe38jngLl4EUknvBtq5hxuuwWtTX5qnwK_90h5-sbgF98Tio47qnnv-wA50LawMrDvcEbWMjdBXeFD4hE4QCSCi43i3oRms09g1c6gHipjTOTGmZ0Tj6wGAJZHkdJz6uBuvnWkuypYjaZG1vap_baLugSmjP71PUzn7jgFR1dQDEOcZE91-dERlCPeU7RXdDOTrUJMjD4yvfXO3VdB53YiZErMIgCv7rx1qZhzBPmyg2Z3XK86kY877HD4I-DOerJKeqPYl9vfVmFQgRRLFdOhi5ZpmUwJaRKG0zjTDDfOuvFG16WNPCrr3-_AIU3ANaCvL4Lg44t2lamlRaKlEvT5aKxphO2cVZjSWsTPJMHgHXWYM01e09i3WDbL07g35vJWsnRrrhxhiMoVJJG68-WrZVtev47fT69of6Z5_lhFcc7donENuxlN3K2V8P90Nkxu4eYbHwp267IvadONcgCMO_wHdKwZZswFUs5HYVyYVOZKtmE2T4I7JJWrOeL2iM_VWSFwkwV0hCLQyKazQZwVIe8s2s3glYY8ektc36reTZoSg4ykhanq26OLX4VKw9UzvfyV_J-EozNh2WXlhtgGqoeomjVrNp6U612ywre3QLN-lvSDjd2MoQsZ-CG4S6kyTuXNT0KxsdXs-hXUlXRNbri8fshIjSkYjCVWUKvNFvn7IMJ5AxYakWekKdPL7r75Q7HNJMMYxt8jh7fv7N8QKWuOnWWy_kA8N6qXIsHsetBeBfGBHbq92mQkfcdArVKuysqTzSy2wm9t4mLNFbzO1QPAQ9VS6aYS3DcWh2NF_pc2xlRCRt9Mb1P9IYEUQk7P2iakeYUhKH1MMNh0GuMwkCIaed4XCTEVZfSB70YtPUCawgNFP9hn5ENUVNRWBf6717gT1ioybimXghodrCOHiYxxQDDpss3e8MIl_x-BaqW8C2zYFd6xE0pVFXV5-X7O6XP2sc3ClOd1EyVnLRT1-87Uof-1KYA2kzTyPfWrnC72maTbOJzeje2f6oT98BfsgkvakOAchAkEl_FJz_Dv_KdJ9ZwC9Xv0Wan4dvSS5aR35iifXptuZ0du0pc2t6_CoHGLZxOG6SvXm7AN24XYFcWnRPvGUS2M5NG4pHJn73vOPaon1SAIBUrLiDXSWeW_27G_5UG5P1lPXYecFMjVG2vdKPEDxygu3yj1e5CDyeVmvcnI3-Hl_4skomLB14as8U950O7fr-CuS_BAli6m0mplgAPCOrfeyq_o-xWdM9vNoaEHRGA5e2ZfEIknCinSY7CuoGCnMmR0O8eT2P3aQ34TKHRRspvCVs8GAyzCZaVT8_ZeOHCl4FU8Ac5NIe3OMRPuZs1uJaBfBIVlPP9MfhKgEA_S5t8vfa3RJhiU0jMy5h9OToqnBOQsiIkY0mjSMsn3VvsqeNutK5DKoTpATX822sSHCSYXAewk7F-agvqKnM_cPVhib9Z1r0UXLS2neLZwF5ob7uI1nYU8TNb6cawcWPGBz9FoMjtxXsMsAci5luEVg1ZfGTU9kShAa3sdfRYC5E4L37_Fy_4EZyNEKEMPxx8I20PCPfqEPR_JB0geDv0Up9ZfD2ZwgwovYDVbGv3qIbgbkEH2Z7zf2e4gH9sZClvei1XigDL9gjfJ0b9IdA3QpWw6b3uleR-WbNWag5S2Phz6kPB2irBgoN7oG_gUegXQTzCif0mgeQSwbea1vXOngXBLG1PiyRk_iPKPhZMmg1UoMeqXQlXqDL4VFRnMOsYdOKr-BWsgdCM9zE3CCyVueBX0zTuZU0kM0P8hUH9RsZYdqPOXS0d4Fy0YUmQZTHWwSMbCUG1XmJ4QN3y1FKUKBvRRHZmZboYHz5EKFMHhAbk9ZHZRCpLm4hIlH81IiSgRlYm3CacJqjlAiLp0Tc0zF6oFlZFipA-nM5znhgDJMSV-CSW1FSDvYFvHolOxR4U0hlw_XG6NeytrkiAR7-wvU3ufkslsWowtcyswCNHcT7eg-tpptSXyT0RJaQhWwAc9L9lYWZnCBwknUCak23u1V7jM8ZldOM5jiQrjRvEBv-sqMto4Qo6129AatIKri04PYD9VlHzLP76KY4F-UHUcu-9g3cJp9mnbnzhmD1LvNPQmH2giY0pc9hFWW6_Ablz7GmW2cngb9xwHAgi-WBSrZYoW6l2dAdkm72ECwWmMguwT6OZdaZZzjBYixHKM-mnb4uzVT6CU-pp4-G9dYtX5EPqhKcmsmwbV6qiziV61rGYypP37spT8H_SWTFmqD-sMPg6jJj1PncSFd2mlZFBkuFJDvF6Aorf35t9-rePPRc18k14Poa8J8j_mYVJo3lEIrtRDLF3d8EvZ9UEjmgBj25gSiYhOJBPriRop1qmlVVSUjoTBIJaXlTXefbcZTqc8vguzQ5Oy8rjzTaxeP1-OgsCDO0xw7ibWEeN",
|
||||
"DataProtected": true
|
||||
}
|
||||
|
||||
@ -33,9 +33,14 @@ public sealed class IdentityContext : IdentityDbContext<ApplicationUser, Identit
|
||||
base.OnModelCreating(builder);
|
||||
}
|
||||
|
||||
public async Task BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken = default)
|
||||
public async Task BeginTransactionAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
_currentTransaction ??= await Database.BeginTransactionAsync(isolationLevel, cancellationToken);
|
||||
if (_currentTransaction != null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_currentTransaction = await Database.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken);
|
||||
}
|
||||
|
||||
public async Task CommitTransactionAsync(CancellationToken cancellationToken = default)
|
||||
|
||||
@ -1,3 +1,2 @@
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user