В сообщении об ошибке указано, что именно идет не так: вы пытаетесь прикрепить объект, который был загружен из другого DataContext, в вашем случае из другого экземпляра DataContext. Не удаляйте свой DataContext (в конце оператора using
, который он удаляет), прежде чем изменять значения и отправлять изменения. Это должно работать (все в одном using
утверждении). Я только что увидел, что вы хотите снова прикрепить объект к коллекции членов, но он уже там. Не нужно этого делать, это должно работать так же хорошо:
using(TheDataContext dc = new TheDataContext())
{
var test = dc.Members.FirstOrDefault(m => m.fltId == 1);
test.Name = "test2";
dc.SubmitChanges();
}
Просто измените значение и отправьте изменения.
Последнее обновление:
(удалены все предыдущие 3 обновления)
Мое предыдущее решение (снова удалено из этого поста), найдено здесь опасно. Я только что прочитал это в статье MSDN :
"Вызывать методы Attach можно только на новых
или десериализованные объекты. Единственный способ
для сущности быть отделенным от его
исходный контекст данных для него должен быть
сериализованная. Если вы попытаетесь прикрепить
непривязанная сущность к новым данным
контекст, и эта сущность по-прежнему имеет
отложенные загрузчики от предыдущего
контекст данных, LINQ to SQL будет выброшен
исключение. Сущность с отложенным
загрузчики из двух разных данных
контексты могут привести к нежелательным результатам
когда вы выполняете вставку, обновление и
удалить операции на этом объекте. За
больше информации об отсрочке
загрузчики, см. Отложено против Немедленно
Загрузка (LINQ to SQL). "
Используйте это вместо:
// Get the object the first time by some id
using(TheDataContext dc = new TheDataContext())
{
test = dc.Members.FirstOrDefault(m => m.fltId == 1);
}
// Somewhere else in the program
test.Name = "test2";
// Again somewhere else
using(TheDataContext dc = new TheDataContext())
{
// Get the db row with the id of the 'test' object
Member modifiedMember = new Member()
{
Id = test.Id,
Name = test.Name,
Field2 = test.Field2,
Field3 = test.Field3,
Field4 = test.Field4
};
dc.Members.Attach(modifiedMember, true);
dc.SubmitChanges();
}
После копирования объекта все ссылки отсоединяются, и все обработчики событий (отложенная загрузка из db) не подключаются к новому объекту. Только поля значений копируются в новый объект, который теперь можно безопасно прикрепить к таблице членов. Кроме того, вам не нужно запрашивать БД во второй раз с этим решением.