我正在使用 Blazor Server,我需要向所有数据库记录添加审计信息。
为此,我覆盖了 SaveChanges/SaveChangesAsync 以添加审计细节
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
SetAudit();
return base.SaveChangesAsync(cancellationToken);
}
/// <summary>
/// Populate the audit part of the db records
/// </summary>
/// <returns></returns>
public override int SaveChanges()
{
SetAudit();
return base.SaveChanges();
}
private async Task SetAudit()
{
var state = await _auth.GetAuthenticationStateAsync();
var userId = state.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value ?? "seed";
var tracker = ChangeTracker;
问题是如何让 IOC 将 AuthenticationStateProvider 传递给 DataContext。
public DataContext(DbContextOptions<DataContext> options, AuthenticationStateProvider auth) : base(options)
{
_auth = auth;
}
它不起作用,因为 DataContext 是从 IDesignTimeDbContextFactory 中创建的
public class DesignTimeFactory : IDesignTimeDbContextFactory<DataContext>
{
public DataContext CreateDbContext(string[] args, AuthenticationStateProvider auth)
{
var optionsBuilder = new DbContextOptionsBuilder<DataContext>();
const string connectionString =
@"server=localhost\\sqlexpress;database=bedbrigade;trusted_connection=SSPI;Encrypt=False";
optionsBuilder.UseSqlServer(connectionString);
return new DataContext(optionsBuilder.Options, auth);
}
}