Использование Linq to Sql не обновляется, но не генерирует исключение

Запуск .net 2008, asp.net, Linq to sql, sql server 2008 express

Foo f = db.Foo.First(x => x.ID == id);
f.IsValid = true;
db.SubmitChanges();

У меня есть очень простая таблица, в которой есть несколько полей и нет ограничений FK. Ни один из данных не сохраняется при вызове .SubmitChanges(), но ошибка не возникает. Любые идеи?

Не используя какую-либо явную область транзакций, поля не генерируются автоматически и на сервере не запускаются триггеры.

4 ответа

Отбросьте в сторону, первое, что нужно попробовать, - установить db.Log = Console.Out;, чтобы увидеть, есть ли какие-либо проблемы с TSQL (или лучше: запустить трассировку SQL). Если ничего не отправлено, возможно, IsValid уже был прав - он не будет повторно сохранять такие изменения, если только он не должен (если вы не заставите его).

Менее вероятно, что вы, возможно, случайно отключили отслеживание объектов (db.ObjectTrackingEnabled).

Другие распространенные ошибки включают:

  • не вызывать Complete() при использовании TransactionScope (если вы используете TransactionScope)
  • с файлами базы данных (а не с отдельным сервером), проверяя исходный файл (в решении), а не на выходе сборки (обычно/bin/debug или /bin/release ).

Я также предполагаю, что IsValid на самом деле является db-отображаемым свойством (они не обязательно должны быть)


IsValid помечен как поле AutoGenerated в дизайнере? Если это так, никакие изменения, которые вы вносите, будут переданы обратно на сервер. Кроме того, возможно ли, что у вас есть триггер DB, который может быть запущен при обновлении, вместо того, чтобы сказать "вставить", который устанавливает значение по умолчанию 0 (false)?


Вам нужно установить IsValid на f, а не на x.

Foo f = db.Foo.First(x => x.ID == id); 
f.IsValid = true; 
db.SubmitChanges();

И не забудьте позвонить Complete на ваш TransactionScope, если вы используете его.


Оказывается, что первичный ключ был удален из БД с момента последнего использования этого приложения. Когда я недавно обновил .dbml, он сгенерирован без первичного ключа. Добавление этого исправления устраняет проблему.

licensed under cc by-sa 3.0 with attribution.