0

好的,所以我有一个区域,人们可以在其中创建为期 14 天的 OpenHouse 列表,然后列表过期,应该删除,我的问题是;是否有某种方法可以让数据库自动删除列表?这是我下面的简单代码,但它不是最佳的

protected void Application_Start()
    {
        openhouse mydate= new openhouse();
        if (mydate.expired > DateTime.Now)
        {
            db.openhouses.Remove(mydate);
        }
     }

正如你所知道的那样,在我的 Global.asax 中,但问题是只有在我编译应用程序时才会删除列表我认为必须有一种比我每天为此编译更有效的方法,任何建议都会非常感谢...

4

1 回答 1

0

数据库本身不会为您提供任何计时器或计划任务(至少 SQLLite 不会)。您必须编写一个清理过期列表的任务,为此,您有几个选项:

  • 使用在您自己的 ASP.net 应用程序中安排的任务
  • 使用由您的托管服务提供商安排和管理的任务(单独的应用程序)。如果您在云上,您的云提供商很可能有能力为您执行此操作。

如果您想使用第一个选项,请查看Quartz。我在 Azure 上有一个 WorkerRole,而不是使用 Quartz 来做你需要的事情。设置起来相当简单,这里有一个例子:

        // Initialize Quartz
        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
        _scheduler = schedulerFactory.GetScheduler();
        _scheduler.JobFactory = new NinjectJobFactory(_kernel);

        DateTimeOffset morning = DateBuilder.NewDateInTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"))
            .AtHourMinuteAndSecond(5, 30, 0)
            .Build();

        // Schedule task for email being sent to people who have not signed up after their trial expiry
        IJobDetail userFeedbackJobDetail = JobBuilder.Create<LostUserFeedbackRequestJob>().WithIdentity("User Feedback Emails").Build();
        ITrigger dailyTriggerForUserFeedback = TriggerBuilder.Create()
            .WithIdentity("Daily Trigger (User Feedback)")
            .StartAt(morning)
            .WithSimpleSchedule(schedule => schedule.WithInterval(TimeSpan.FromDays(1)).RepeatForever())
            .ForJob(userFeedbackJobDetail)
            .Build();
        _scheduler.ScheduleJob(userFeedbackJobDetail, dailyTriggerForUserFeedback);

        // Finally, start the scheduler
        _scheduler.Start();

这每天都会发送一封电子邮件,询问在试用期结束后没有选择使用我的一个项目的服务的用户的反馈。该作业每天早上 5:30 运行

于 2013-09-16T23:47:39.420 回答