asp.net 如何在30分钟后更新dbcontext中数据表[已关闭]

zf9nrax1  于 2023-03-13  发布在  .NET
关注(0)|答案(3)|浏览(130)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

48分钟前就关门了。
Improve this question
我正在尝试开发类似airbnb的东西,当用户预订一套公寓时,我想将该公寓封锁30分钟,如果用户不付款,系统将从readyForReserve表中删除该公寓的封锁。
我的问题是,我应该如何检查,如果住宅完成30分钟的等待,并应从阻止列表中删除?
(BTW-我的数据库是ssms,我使用efcore和linq)
如何在30分钟后更新数据库表?
我找到了backgroundServicedelay,但我不确定它们是否正确

v64noz0r

v64noz0r1#

您应该编写一个辅助服务(使用项目的“WorkerService”模板),并通过更改解决方案属性将其添加到启动项目中。
我将把工人示例代码为您在这里:程序.cs

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

工作进程.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.
            }

        }
    }
}
nimxete2

nimxete22#

您不需要不断更新您的表格,只需在预订中设置一个到期时间(或一个创建时间,然后根据该时间进行计算)。
例如:

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");
}

要点是,**任何已经过期的保留将被简单地忽略。**不需要在后台发生对表的更新。

im9ewurl

im9ewurl3#

我找到了backgroundService和delay,但我不确定这些是否正确
是的,如果您运行一个或多个服务器示例,则应使用backgroundService

如果只有一个服务器示例,则可以使用托管服务
方法如下:
1.锁定公寓资源一旦订单下,排队延迟的工作,以释放此锁后30分钟
1.设置一个周期作业,以释放超过30分钟的所有单元资源锁

相关问题