Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Проблема с submitChanges () вставкой нежелательных записей в linq

Автор вопроса: hIpPyОтветов: 1

Я использую LINQ для вставки записей в базу данных. Я создаю эти записи и отслеживаю их с помощью списка. Исходя из некоторой логики, я удаляю некоторые записи, удаляя их из Списка. (Я использую тот же объект DataContext).

Когда я хочу вставить записи в базу данных, я выполняю InsertOnSubmit () соответствующей таблицы linq, а затем SubmitChanges () для объекта datacontext. LINQ также вставляет записи, удаленные из списка, вместе с теми, которые присутствуют в списке.

пример:

//list to keep track of records to insert
List list

// add the records to list
list.add(some records)

//deleted last 2 records
list.remove()

//call InsertAllOnSubmit on the linq table passing the list object with records to insert
linqTable.InsertAllOnSubmit(list)

//call SubmitChanges on datacontext object
datacontext.SubmitChanges()

Я наткнулся на эту статью msdn Состояния объектов и отслеживание изменений (LINQ to SQL) < / а>

Вы можете явно запросить вставки с помощью InsertOnSubmit. В качестве альтернативы LINQ to SQL может определять вставки, находя объекты, связанные с одним из известных объектов, которые необходимо обновить. Например, если вы добавляете объект Untracked в EntitySet (TEntity) или устанавливаете EntityRef (TEntity) на объект Untracked, вы делаете объект Untracked доступным посредством отслеживаемых объектов на графике. При обработке SubmitChanges LINQ to SQL просматривает отслеживаемые объекты и обнаруживает все достижимые постоянные объекты, которые не отслеживаются. Такие объекты являются кандидатами для вставки в базу данных.

Думаю, вопрос сводится к следующему - как изменить состояние удаленных объектов на "Не отслеживается"?

Я попробовал DeleteOnSubmit после удаления объектов из списка, но это дает исключение (невозможно удалить объект, который не был прикреплен).

Может кто-нибудь указать мне решение? Спасибо.

Я хотел бы знать, могу ли я добиться этого, используя только LINQ. (Я знаю, что могу использовать сохраненную процедуру и вставлять только записи в списке.)

linqtrackingsubmitchangesinsertonsubmit

Ответы

Ответ 1 · Christian C. Salvadó

Я думаю, что элементы вашего списка не удаляются, потому что List.Remove определяет равенство, используя компаратор по умолчанию.

Если вы не хотите писать собственный компаратор, я рекомендую вам использовать RemoveAll, который получает в качестве первого параметра предикат, соответствующий элементам, которые будут удалены из списка:

list.RemoveAll( e=> /*condition to remove the element*/ );

Или метод RemoveAt, который удаляет элемент на основе указанного индекса. :

list.RemoveAt(0); // Delete first element

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы