從DataContext
派生的自動生成的類不打算是長壽命的對象。在絕大多數用例中,你應該實例化一個,讀取你需要的數據和/或進行你需要的改變,提交,然後忘掉這個對象。它不直接表示與數據庫的連接 - 實例化大量DataContext
s不一定會打開到數據庫的多個連接。
這樣做的後果是你應該認爲你的數據是總是陳舊,特別是如果一個單獨的進程可以訪問同一個數據庫。只要您檢索到數據,其他進程就可以立即更新該數據。確保非陳舊性的唯一方法是維持一個開放的交易,而且我相信您知道,保持交易持續時間過長的後果是其他流程會發現數據庫非常無響應,就好像它非常慢 - 所以只使用事務處理步驟,幾乎只涉及需要原子化的數據庫訪問。
因此,在您的具體情況下,找出是否有任何新操作需要執行的唯一方法是不斷詢問數據庫。您不必一直檢索數據並使用Equals進行比較;您可以只檢索尚未得到的所有數據,即告訴數據庫僅返回新的行。因爲我不知道你的數據庫模式,我胡編這裏,但我敢肯定,這會給你一個想法:
var newActions = db.ScheduledActions.Where(act => !oldActions.Contains(act)).ToList();
if (newActions.Any()) {
// ... do something intelligent with the new actions ...
oldActions = oldActions.Concat(newActions);
// or perhaps oldActions.AddRange(newActions); if oldActions is a List<>
}
編輯:我現在認識到,你需要檢查不僅針對新的動作,還針對將更改爲現有動作。就我個人而言,實現這一點的方法是在ScheduledActions表上指定一個日期/時間字段,用於指定上次更改的時間。那麼你不需要一個自定義的相等比較器,而是可以使用它來找出發生了什麼變化。不幸的是,這意味着你需要檢索所有的動作,甚至是那些沒有改變的動作。在下面的例子中,我假定ScheduledAction是由string
類型的主鍵標識的;更改到int
如果你使用數字鍵:
Dictionary<string, ScheduledAction> oldActions = new ...;
[...]
var allActions = db.Actions.ToList();
var changedActions = allActions.Where(act => !oldActions.ContainsKey(act.Id) || oldActions[act.Id].LastChanged < act.LastChanged).ToList();
if (changedActions.Any())
{
// do something intelligent here
}
夢想之地如何?...我一直在想到那裏。 – Rusty 2010-08-03 21:42:58