Вызывает ли ToArray в IQueryable удаление объекта из LinqToSql? - PullRequest
1 голос
/ 26 октября 2009

У меня есть запрос 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 ]

1 голос
/ 26 октября 2009

Можете ли вы положить все это одним способом и попробовать?

Ответ - «Нет», это не так.

Если вы не используете разные, то используйте db для удаления, а не select (это может произойти, если вы это не понимаете) или db.ObjectTrackingEnabled где-то имеет значение false.

1 голос
/ 26 октября 2009

Я подозреваю, что вы используете разные DataContexts при выборе сущностей и при отправке изменений. Если это так, ошибка естественна и все равно произойдет, если вы вернете IQueryable вместо нативного array. Либо вы Attach сущность в новый контекст данных, либо вы используете тот же, где вы выбрали начальные сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...