Автоматически сгенерированные классы, производные от 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, которое указывает время последнего изменения. Тогда вам не нужен специальный компаратор равенства, но вместо этого вы можете использовать его, чтобы узнать, что изменилось. К сожалению, это означает, что вам нужно получить все действия, даже те, которые не изменились. В следующем примере я предполагаю, что ScheduledActions идентифицируются первичным ключом типа 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
}