应用程序在某个确切时间采取行动

时间:2018-06-05 18:37:45

标签: c# entity-framework asp.net-core

假设我有一个模型

public class SomeModel
{
    public DateTime StartDate { get; set; }
    public bool IsActive { get; set; }
}

我的问题是:当StartDate中确定的时间到来时,将属性IsActive更改为true的最佳做法是什么?我应该使用代表/事件还是计时器?我将感谢一些简短的例子。

关键是IsActive存储在数据库中,因此在其数据库中存储。改变我想在db。中更新模型。

3 个答案:

答案 0 :(得分:2)

不需要计时器,因为您不需要设置任何内容。只需编写一个计算IsActive的属性。

public class SomeModel
{
    public DateTime StartDate { get; set; }
    [NotMapped]
    public bool IsActive { get; } => DateTime.UtcNow >= StartDate;

}

答案 1 :(得分:0)

IsActive设为计算属性。

public class SomeModel
{
    public DateTime StartDate { get; set; }
    public bool IsActive
    {
        get { return DateTime.Now >= StartDate; }
    }

}

答案 2 :(得分:0)

最好使用这些其他答案描述的属性。你不应该在你的Db中有一个IsActive列,因为它可以很容易地计算出来。话虽这么说,如果您需要像您一样要求处理数据库中的更新,那么您将需要以下内容:

您应该从您的操作执行此操作,因为它会延迟对客户端的响应,可能会超时并消耗资源。

您可能需要的是一个调度程序,它在您的.net核心应用程序运行时执行数据库更新。由于您无法始终依赖此功能,因此您还需要在启动时对其进行处理。

考虑这样的调度程序 - Hangfire - FluentScheduler

定义此功能:

void UpdateActiveInDatabase(MyDbContext myDb){
    var models = myDb.myModels.Where(model => !model.IsActive && model.StartDate <= DateTime.UtcNow); //These models should be active
    foreach(var model in models) { model.IsActive = true; }
    myDb.SaveChanges();
}

然后,当您的应用开始时:

var myDb = GetMyDb(); // Get a DbContext instance from your DI somewhere
UpdateActiveInDatabase();

var models = myDb.myModels.Where(model => model.StartDate > DateTime.UtcNow); //These models need to be updated in the future
foreach(var model in models){
    // Dependent on the scheduler you pick. Will need to get a DbContext from your DI and call UpdateActiveInDatabase(myDb);
}

每当您的表格中的实体发布更新时,您还需要UpdateActiveInDatabase(myDb);