假设我有一个模型
public class SomeModel
{
public DateTime StartDate { get; set; }
public bool IsActive { get; set; }
}
我的问题是:当StartDate中确定的时间到来时,将属性IsActive更改为true的最佳做法是什么?我应该使用代表/事件还是计时器?我将感谢一些简短的例子。
关键是IsActive存储在数据库中,因此在其数据库中存储。改变我想在db。中更新模型。
答案 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);