在应用程序启动时清理数据库
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
方法。
是否可以在应用程序启动后删除这些条目?
我需要在调用 AddDbContext
后 Startup
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();
}
[...]
}
我采用了一种将 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
方法。
是否可以在应用程序启动后删除这些条目?
我需要在调用 AddDbContext
后 Startup
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();
}
[...]
}