我對Asp.net
挺新的,有一個網站使用Entity Framework
。每天晚上,我需要在我的Person
實體上做一些工作。 因此我安裝Quartz.Net
等試圖用這種方式在Global.asax
:如何在EF(DB優先)實體上實現計劃任務?
<%@ Application Language="C#" %>
<%@ Import Namespace="Quartz" %>
<%@ Import Namespace="Quartz.Impl" %>
<script runat="server">
private IScheduler Scheduler { get; set; }
void Application_Start(object sender, EventArgs e)
{
Scheduler = StdSchedulerFactory.GetDefaultScheduler();
Scheduler.Start();
IJobDetail dailyReset = JobBuilder.Create<ApplicationJobs.DailyReset>()
.WithIdentity("dailyReset", "group1")
.Build();
ITrigger dailyResetTrigger = TriggerBuilder.Create()
.WithIdentity("dailyResetTrigger", "group1")
.StartAt(DateBuilder.DateOf(3, 0, 0))
.WithSimpleSchedule(x => x
.WithIntervalInHours(24)
.RepeatForever())
.Build()
Scheduler.ScheduleJob(dailyReset, dailyResetTrigger);
}
</script>
然後我ApplicationJobs類:
public class ApplicationJobs : System.Web.HttpApplication
{
public class DailyReset : IJob
{
public void Execute(IJobExecutionContext context)
{
using (var uow = new UnitOfWork())
{
foreach (Person person in uof.Context.Persons)
{
//do something
}
}
}
}
}
而且最後的UnitOfWork:
public class UnitOfWork : IDisposable
{
private const string _httpContextKey = "_unitOfWork";
private MyEntities _dbContext;
public static UnitOfWork Current
{
get { return (UnitOfWork)HttpContext.Current.Items[_httpContextKey]; }
}
public UnitOfWork()
{
HttpContext.Current.Items[_httpContextKey] = this;
}
public MyEntities Context
{
get
{
if (_dbContext == null)
_dbContext = new MyEntities();
return _dbContext;
}
}
}
但using (var uow = new UnitOfWork())
不因爲uow的構造函數中的HttpContext.Current.Items[_httpContextKey] = this;
;我讀HttpContext.Current
不在Application_Start
。
在讀取相關的帖子,特別是this one但我真的不明白,如果我確實需要像UnitOfWorkScope
described here創造的東西,或者有可能是一個辦法做到這一點,因爲它是目前。
那麼是否有任何干淨和安全的方式來安排一些任務,這將使用我的UnitOfWork
以更新實體?
非常感謝。
感謝您的回覆!這是我第一次做這種事情,所以它真的有幫助。我看了一下你所關聯的教程,但我不明白在這種情況下可以用'JobDataMap'完成什麼。我理解它是如何工作的,但是爲了能夠使用我的實體,我可以通過什麼樣的論證來工作? –
jobdatamap允許您在爲未來運行作業創建作業期間傳遞參數(字符串,數字和對象)。在你的情況下,你不需要傳遞參數,只需要在作業開始時使用'using(_dbContext = new MyEntities())'執行部分 –
這很好,我簡直不敢相信我沒有想過直接使用'new MyEntities()'。非常感謝(爲了您對Quartz調度程序保持活躍狀態的評論),您讓我的一天! –