Linq2SQL работает на Console Applicaton, но не работает на Windows Service - PullRequest
0 голосов
/ 25 июля 2011

Трудно было выбрать правильный заголовок, но вот проблема:

У меня есть приложение с простой логикой, которое получает данные из TFS, перебирает «элементы» и обновляет локальную БД с помощью этих «Предметы".Вот фрагмент кода для обновления строки:

using (ResultDBDataContext local_db= new ResultDBDataContext())
{
DBTestResult dbRes = local_db.DBTestResults.getByPrimaryKey(args_supplied);
if (dbRes == null) {
  dbRes = new DBTestResult(){//set properties}
  local_db.DBTestResults.InsertOnSubmit(dbRes);
}
else{
  dbRes.isDirty = true;
  dbRes.otherPropertis = set_to_some_values;
}
local_db.SubmitChanges();
}

Это работает в программе Windows Console (импортировано> 100K строк, как это), что подтверждает правильность логики.Но когда я помещаю ту же логику в службу Windows (для тех же данных), через некоторое время (<2K строк) я получаю исключение SQL, говорящее «невозможно вставить дубликат ключа в таблицу».Обратите внимание, что я выполняю SubmitChanges () после обновления / вставки <strong>каждой строки

Я думаю, что это как-то связано с нижеследующим, но не смог выяснить причины:

  • Как службы Windows обрабатывают подключения к БД.(Они объединяют? Они кэшируют данные? И т. Д.)
  • Linq2SQL Dataconext, обрабатывающий его объекты обновления.(Какие свойства Linq2SQL Datacontext заставляют его вести себя по-разному в Windows Services?)

Любые идеи / предложения / ссылки / учебные пособия / статьи о том, как решить эту проблему или узнать больше информации о проблеме,очень приветствуется.

Спасибо.

Обновление : данные, поступающие из TFS, могут нарушать ограничение первичного ключа базы данных - но так как я вставляю / обновляю одну строку ввремя и фиксация изменений, последняя запись для того же первичного ключа будет находиться в базе данных.

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Приветствуются любые идеи / предложения / ссылки / учебные пособия / статьи о том, как решить эту проблему или узнать больше информации о проблеме.

Мне кажется, что это не проблема с сервисной стороной кода.

Я думаю, что вам нужно регистрировать / проверять это поведение ошибки дальше - просто попробуйте записать, для какого первичного ключа (-ов) это происходит, - возможно, вы заметите некоторую ошибку в реализации getByPrimaryKey таким образом.

Также проверьте, что ваш сервис однопоточный - то есть, что не может быть двух экземпляров, выполняющихся одновременно - это, безусловно, может привести к ошибке.

0 голосов
/ 25 июля 2011

Что вызывает ваш сервис, чтобы начать его работу? Похоже, ваш процесс запускается второй раз, что приводит к тому, что ваши данные обрабатываются дважды, а не один раз при запуске его как консольного приложения.

Например, если вы используете FileSystemWatcher, чтобы сообщать, когда поступают новые файлы для обработки, наблюдатель будет запускать несколько событий, когда файл создается и добавляется (обновляется).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...