Вызывает ли 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.

Другие вопросы по тегам