Вызывает ли ToArray в IQueryable удаление объекта из LinqToSql?
У меня есть запрос LinqToSql, который возвращает массив объектов Article следующим образом:
return db.Articles.ToArray();
Затем я перебираю этот массив и начинаю удалять некоторые элементы, которые соответствуют определенным критериям, для простоты, скажем, я удаляю их все, вот так:
foreach (var item in array)
db.articles.DeleteOnSubmit(item);
Вызов DeleteOnSubmit (entity) генерирует недопустимое исключение операции, в его сообщении говорится: "Невозможно удалить объект, который не был присоединен". Я изменил код, чтобы сначала получить объект, а затем удалить его, и он работал просто отлично. Вот рабочий код:
db.DeleteOnSubmit(db.Articles.Where(c=>c.Id == item.Id))
Теперь я знаю, что это сработало бы, если бы я изменил хранилище так, чтобы оно возвращало IQueryable вместо собственного массива, я просто не понимаю, почему? Имеет ли ToArray какое-либо отношение к этому недопустимому исключению операции?
Благодарю.
ps: db - это ссылка на объект DataContext.
2 ответа
Я подозреваю, что вы используете разные DataContexts при выборе объектов и при отправке изменений. Если это так, ошибка является естественной и все равно произойдет, если вы вернули IQueryable
вместо родного array
, Или вы Attach
объект в новый контекст данных, или вы используете тот же, где вы выбрали начальные объекты.
Можете ли вы положить все это одним способом и попробовать?
Ответ "Нет", это не так.
Если вы не используете для удаления не разные db, а select (это может произойти, если вы этого не понимаете) или db.ObjectTrackingEnabled где-то имеет значение false.