Очистить базу данных при запуске приложения - PullRequest
1 голос
/ 31 октября 2019

Я адаптировал подход отображения signalr подключений к пользователям для моего aspnet core 3.0 приложения. Подход, о котором я говорю, описан в Отображение пользователей SignalR на соединения , раздел Permanent, external storage. Я знаю, что эта статья была написана для другой версии Asp.Net, но она пригодилась.

Это код хаба:

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 не был вызван.

Можно ли удалить эти записи после запуска приложения?

1 Ответ

1 голос
/ 31 октября 2019

Мне нужно было добавить следующий код в метод Configure класса Startup после вызова AddDbContext:

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();
    }
    [...]
}
...