Это то, что мне не нравится в LINQ-to-SQL.
Обычно это нормально работает, если вы запрашиваете и обновляете в одной и той же области, но если вы получаете объект, кэшируете его, а затем пытаетесь обновить его позже, вы не можете.
Вот что написано в документации:
Используйте методы Attach с объектами, которые были созданы в одном DataContext и сериализованы клиенту, а затем десериализованы обратно с намерением выполнить операцию обновления или удаления. Поскольку новый DataContext не может отследить, какие исходные значения были для отключенного объекта, клиент отвечает за предоставление этих значений. В этой версии Attach предполагается, что объект находится в исходном состоянии значения. После вызова этого метода вы можете обновить его поля, например, с помощью дополнительных данных, отправленных клиентом.
Не пытайтесь присоединить объект, который не был отсоединен посредством сериализации. Объекты, которые не были сериализованы, по-прежнему поддерживают ассоциации с отложенными загрузчиками, которые могут привести к неожиданным результатам, если объект отслеживается вторым контекстом данных.
Немного двусмысленно, ИМХО, в частности, о том, что именно означает "сериализовано" и "десериализовано".
Также, что интересно, вот что говорится об объекте DataContext:
В общем случае экземпляр DataContext
рассчитан на одну единицу
работа "однако ваше приложение определяет
этот термин. DataContext - это
легкий и не дорогой
Создайте. Типичный LINQ to SQL
приложение создает DataContext
экземпляры в области видимости метода или как
член недолговечных классов, которые
представляют собой логический набор связанных
операции с базой данных.
Итак, DataContexts предназначены для узкой области действия - и все же, чтобы использовать Attach (), вы должны использовать тот же DataContext, который запрашивал объект. Я предполагаю / надеюсь, что мы все совершенно не понимаем, для чего действительно предназначен Attach ().
В таких ситуациях мне нужно было повторно запросить объект, который мне нужно было обновить, чтобы получить свежую копию, а затем выполнить обновление.