如何在 30 分钟后更新 dbcontext 中的数据

问题描述 投票:0回答:3

我正在尝试构建类似 airbnb 的东西。当用户预订公寓时,我想将该公寓封锁 30 分钟。如果用户不付款,系统应该从 readyForReserve 表中删除该公寓的区块。

我的问题是我应该如何检查住宅是否完成了 30 分钟的等待,并且应该从阻止列表中删除?
(顺便说一句-我的数据库是 ssms,我使用 efcore 和 linq)
如何在 30 分钟后更新数据库表?

我找到了

backgroundService
delay
,但我不确定这些是否正确

c# asp.net entity-framework ssms
3个回答
1
投票

您应该编写一个工作者服务(使用项目的“WorkerService”模板)并通过更改解决方案属性将其添加到您的启动项目中。

我会在这里为你放工人示例代码: 程序.cs

using WorkerService;
IHost host = Host.CreateDefaultBuilder(args)
   .ConfigureServices(services =>
   {
       services.AddHostedService<Worker>();
   })
   .Build();
host.Run();

Worker.cs

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await Task.Delay(1800000/*30 minutes as milliseconds*/, stoppingToken);
            var reservedItesm = new List<object>(); //change this with your list of saved items
            foreach (var reservedItem in reservedItesm)
            {
                reservedItem.IsLocked = false;
                //update your repository for each item here.
            }

        }
    }
}

0
投票

我找到了backgroundService和delay,但是我不确定这些是不是正确的方式

是的,如果您运行一个或多个服务器实例,您应该使用

backgroundService

如果你只有一个服务器实例,你可以使用托管服务

方法:

  1. 下订单后锁定公寓资源,排队延迟作业以在 30 分钟后释放此锁定

  2. 设置周期任务释放所有公寓资源锁超过30分钟


0
投票

你不需要经常更新你的表格。只需在预订上设置到期时间(或创建时间并据此计算)。

例如:

class Reservation
{
    [Key]
    public int ReservationId {get; set;}

    public Room Room {get; set;}

    public DateOnly StartDate {get; set;}

    public DateOnly EndDate {get; set;}

    public DateTime ExpiryTime {get; set;}

    public bool Paid {get; set;}
}

然后当预订房间时,您可以将

ExpiryTime
设置为半小时的时间。付款后,您可以将其设置为更高的日期。

然后可以按到期日查询可预订

if (someRoom.Reservations.Any(r =>
    r.StartDate < endDate &&
    r.EndDate > startDate &&
    r.ExpiryTime > DateTime.UtcNow))
{
    throw new Exception("Room already reserved");
}

重点是,任何已过期的预订都将被忽略。不需要在后台更新表。

© www.soinside.com 2019 - 2024. All rights reserved.