Проблема с 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. (Я знаю, что могу использовать сохраненный процесс и вставлять только записи в списке.)
1 ответ
Я думаю, что элементы вашего списка не удаляются, потому что метод List.Remove определяет равенство, используя компаратор равенства по умолчанию.
Если вы не хотите писать собственный компаратор, я рекомендую вам использовать метод RemoveAll, который получает предикат в качестве первого параметра для соответствия элементам, которые будут удалены из списка:
list.RemoveAll( e=> /*condition to remove the element*/ );
Или метод RemoveAt, который удаляет элемент на основе указанного индекса:
list.RemoveAt(0); // Delete first element