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

Я использую 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. (Я знаю, что могу использовать сохраненную процедуру и вставлять только записи в списке.)


person hIpPy    schedule 31.07.2009    source источник


Ответы (1)


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

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

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

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

list.RemoveAt(0); // Delete first element
person Christian C. Salvadó    schedule 31.07.2009
comment
Это не то. В списке remove () работает правильно - у меня есть ссылка на элементы, которые я хочу удалить. Записи, вставленные в базу данных, больше, чем записи в списке. - person hIpPy; 01.08.2009
comment
Также следует отметить, что LINQ to SQL обходит отслеживаемые объекты при обработке SubmitChanges (а не при добавлении или удалении записей) и обнаруживает любые достижимые постоянные объекты, которые не отслеживаются. Это означает, что даже если я явно изменю состояние нежелательных записей на «Без отслеживания» при их удалении, они все равно будут обнаружены при последующем вызове SubmitChanges. - person hIpPy; 02.08.2009