我有一個EF代碼優先生成的數據庫。數據處理使用DbContext
完成。 Asp.net應用程序中的IoC容器生成一個DbContext
實例,即BL對象依賴於每個線程。這是一個隨Web應用程序一起加載的後臺任務類。從不同線程保存更改時的EF協議跟蹤
每隔一段時間(如每隔10分鐘),後臺線程通過在事務範圍內調用myDbContext.Add
將一個項目添加到Incidents
列表中。
同時,好像如果Incidents
之一是myDbContext
在「Web請求的線程」改變,即使改變被保存到了片刻的數據庫,它們越來越被集Incidents
的覆蓋,在用戶使用網頁更改Incident
之前,用戶通過背景線拉動了這些內容。
這看起來像一個併發問題(我沒有實現任何像Timestamp列一樣的協調)。
我的問題是:不應該後臺線程只保存更改的數據(在我的情況下,添加一個新的事件),留下整個事件集合?如果確實如此,我的問題來源是其他地方。從後臺線程
代碼:
using (var transaction = new TransactionScope())
{
foreach (var scheduledTask in _db.ScheduledTasks)
{
if (scheduledTask.NextExecuteAfterDate == null)
{
PopulateNextExecuteAfterDate(scheduledTask);
shouldSaveChanges = true;
}
if (DateTime.Now > scheduledTask.NextExecuteAfterDate)
{
RegisterRecurringTicket(scheduledTask);
CalculateNextTime(scheduledTask);
shouldSaveChanges = true;
}
}
if (shouldSaveChanges) _db.SaveChanges();
transaction.Complete();
}
的代碼在子程序RegisterRecurringTicket(scheduledTask);
增加了項目的事件集合。當調用_db.SaveChanges();
時,看起來事件的集合被舊集合覆蓋,將用戶界面生成的更改投棄置於事件集合。如果是這樣,我該如何解決這個問題?
是的。自從我發現,我已經更新了問題主體,我誤導了問題讀者關於問題設置。請看一下。 – 2012-01-31 23:26:05