Что можно сделать, чтобы устранить исключение «Строка не найдена или изменена» в LINQ to SQL в базе данных SQL Server Compact Edition? - PullRequest
89 голосов
/ 05 сентября 2008

При выполнении SubmitChanges для DataContext после обновления свойств пары с соединением LINQ to SQL (для SQL Server Compact Edition) я получаю «Строка не найдена или изменена». ChangeConflictException.

var ctx = new Data.MobileServerDataDataContext(Common.DatabasePath);
var deviceSessionRecord = ctx.Sessions.First(sess => sess.SessionRecId == args.DeviceSessionId);

deviceSessionRecord.IsActive = false;
deviceSessionRecord.Disconnected = DateTime.Now;

ctx.SubmitChanges();

Запрос генерирует следующий SQL:

UPDATE [Sessions]
SET [Is_Active] = @p0, [Disconnected] = @p1
WHERE 0 = 1
-- @p0: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p1: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:12:02 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8

Очевидная проблема - WHERE 0 = 1 . После загрузки записи я подтвердил, что все свойства в "deviceSessionRecord" верны и включают первичный ключ. Также при перехвате «ChangeConflictException» нет дополнительной информации о том, почему это не удалось. Я также подтвердил, что это исключение получает только одна запись в базе данных (запись, которую я пытаюсь обновить)

Что странно, так это то, что у меня очень похожий оператор обновления в другом разделе кода, он генерирует следующий SQL и действительно обновляет мою базу данных SQL Server Compact Edition.

UPDATE [Sessions]
SET [Is_Active] = @p4, [Disconnected] = @p5
WHERE ([Session_RecId] = @p0) AND ([App_RecId] = @p1) AND ([Is_Active] = 1) AND ([Established] = @p2) AND ([Disconnected] IS NULL) AND ([Member_Id] IS NULL) AND ([Company_Id] IS NULL) AND ([Site] IS NULL) AND (NOT ([Is_Device] = 1)) AND ([Machine_Name] = @p3)
-- @p0: Input Guid (Size = 0; Prec = 0; Scale = 0) [0fbbee53-cf4c-4643-9045-e0a284ad131b]
-- @p1: Input Guid (Size = 0; Prec = 0; Scale = 0) [7a174954-dd18-406e-833d-8da650207d3d]
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:50 PM]
-- @p3: Input String (Size = 0; Prec = 0; Scale = 0) [CWMOBILEDEV]
-- @p4: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:52 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8

Я подтвердил, что правильные значения первичных полей были определены как в схеме базы данных, так и в DBML, который генерирует классы LINQ.

Полагаю, это почти вопрос из двух частей:

  1. Почему выдается исключение?
  2. После просмотра второго набора сгенерированного SQL кажется, что для обнаружения конфликтов было бы неплохо проверить все поля, но я думаю, что это будет довольно неэффективно. Так ли это всегда работает? Можно ли просто проверить первичный ключ?

Я боролся с этим последние два часа, поэтому любая помощь будет признательна.

Ответы [ 13 ]

0 голосов
/ 25 июня 2015

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

0 голосов
/ 25 ноября 2011

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

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

0 голосов
/ 06 сентября 2011

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

Кэширование!

Часть select () моего объекта данных использовала кэширование. Когда дело дошло до обновления объекта, возникла ошибка «Строка не найдена или изменена».

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

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