在应用程序启动时清理数据库

Clean database on application startup

我采用了一种将 signalr 用户连接映射到我的 aspnet core 3.0 应用程序的方法。 Mapping SignalR Users to Connections 部分 Permanent, external storage 中概述了我所指的方法。我知道这篇文章是为不同版本的 Asp.Net 而写的,但它派上用场了。

这是 Hub 的代码:

public class SomeHub : Hub
{
    private readonly UserManager _userManager;
    private readonly AppDbContext _dbContext;

    protected BaseHub(UserManager userManager, AppDbContext dbContext)
    {
        _userManager = userManager;
        _dbContext = dbContext;
    }

    public override async Task OnConnectedAsync()
    {
        var user = await _userManager.GetMe();
        user.Connections.Add(new Connection { ConnectionId = Context.ConnectionId });
        await _dbContext.SaveChangesAsync();
        await base.OnConnectedAsync();
    }

    public override async Task OnDisconnectedAsync(Exception ex)
    {
        var user = await _userManager.GetMe();
        if (await _dbContext.Connections.FindAsync(Context.ConnectionId) is {} connection)
        {
            user.Connections.Remove(connection);
            await _dbContext.SaveChangesAsync();
        }

        await base.OnDisconnectedAsync(ex);
    }
}

问题

如果我拆除我的应用程序,Connection 数据库条目将保留在我的数据库中,因为未调用 OnDisconnectedAsync 方法。

是否可以在应用程序启动后删除这些条目?

我需要在调用 AddDbContextStartup class 的 Configure 方法中添加以下代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>([...]);

    using (var serviceProvider = services.BuildServiceProvider())
    using (var serviceScope = serviceProvider.CreateScope())
    using (var context = scope.ServiceProvider.GetService<AppDbContext>())
    {
        context.Connections.RemoveRange(context.Connections);
        context.SaveChanges();
    }
    [...]
}