2013-05-04 2 views
5

Я делал это много раз, и он сработал.Обновление записи с использованием Linq-to-SQL

Каждый пример, я нашел именно то, что у меня есть ..

Я делаю запрос ...

var result = from u in tdc.tblUsers 
      where u.UserID == userID 
      select u; 

, а затем меняю значения Я хочу:

foreach (tblUsers u in result) 
{ 
    //change values (and no im not changing the primary key or foreign keys) 
} 

я представить изменения

tdc.SubmitChanges(); 

Я также попробовал этот путь раньше и получил ту же ошибку

tblUsers result = (from u in tdc.tblUsers 
        where u.UserID == userID 
        select u).Single(); 
result.Address = address; 
result.Phone = phone; 
tdc.SubmitChanges(); 

Это только когда-либо получить 1 запись с этим запросом, поскольку UserID является первичным ключом.

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

+0

Вы используете платформу Entity Framework (и если да, то какая версия)? – gunr2171

+0

Кроме того, ВСЕ ВСЕ ваши таблицы имеют первичные ключи. Сюда входит редактируемая вами и любые ветвящиеся таблицы из внешних ключей. – gunr2171

+0

.NET Framework 4 и да, все таблицы имеют первичные ключи и правильные внешние ключи. Этот запрос выполняется только после 1 таблицы, и в этой таблице нет внешних ключей. Это одна из моих базовых таблиц. –

ответ

6

Вы получаете эту ошибку, возможно, потому что одно из ваших полей имеет что-то другое в конструкторе Linq To SQL и в реальной базе данных.

Или вы посмотрите на эту article

Good Luck может!

+0

Я удалил dbml, обновил источник данных и снова потянул все мои таблицы. Повторная программа и исключение не произошло. Спасибо. Забыл об изменении, которое я сделал в базе данных ранее lol. +1 для вас –

+0

Я тоже. Он сказал мне, что я должен был ждать пару минут lol –

2

Возможно, вы работаете с другим контекстом? Попробуйте инкапсулировать его с помощью.

как этот

using (myContext ctx = new myContext()) 
{ 
    var user = ctx.users.first(); 
    user.name="blah"; 
    ctx.SubmitChanges(); 
} 
0

Довольно часто, если вы посмотрите на фактический SQL, что Linq к SQL генерирует, вы увидите, что она является действительно чрезмерно усердствовать с совпадающей строкой базы данных, которые изначально извлекается. Представьте, что у вас есть таблица с идентификаторами столбцов (PK), A, B, C. Можно подумать, что если вы обновили столбец C для строки, должно быть достаточно, чтобы обновить строку с помощью соответствующего первичного ключа. Но часто случается, что Linq-to-SQL также пытается сопоставлять столбцы A и B. Обычно это нормально. Если у вас нет одновременной записи, будь то многопоточность или многопроцессы, а что-то еще изменяет столбцы A или B для записи, которую вы пытаетесь обновить. Затем вы получаете это System.Data.Linq.ChangeConflictException: строка не найдена или не изменена. ошибки при вызове SubmitChanges() в контексте данных.

Смежные вопросы