проблема с submitChanges () вставка нежелательных записей в linq - PullRequest
0 голосов
/ 01 августа 2009

Я использую 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 может выводить вставки по поиск объектов, связанных с одним из известные объекты, которые должны быть обновлено. Например, если вы добавите Неотслеживаемый объект EntitySet (TEntity) или установить EntityRef (TEntity) для неотслеживаемого объект, вы делаете неотслеживаемый объект достижимы с помощью отслеживаемых объектов в график. Во время обработки SubmitChanges, проходы LINQ to SQL отслеживаемые объекты и обнаруживает любые достижимые постоянные объекты, которые не отслеживается. Такие объекты кандидаты на включение в базы данных.

Полагаю, вопрос сводится к следующему: как изменить состояние удаленных объектов на «Не отслежено»?

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

Может кто-нибудь, пожалуйста, указать мне на решение? Благодарю.

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

1 Ответ

0 голосов
/ 01 августа 2009

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

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

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

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

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