2009-07-31 42 views
0

我正在使用LINQ在數據庫中插入記錄。我創建這些記錄並使用列表跟蹤它們。基於某種邏輯,我從列表中刪除一些記錄。 (我正在使用相同的DataContext對象)。問題submitChanges()在linq中插入不需要的記錄

當我想要在數據庫中插入記錄時,我在datacontext對象上執行相應的linq表的InsertOnSubmit(),然後執行SubmitChanges()。 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文章Object States and Change-Tracking (LINQ to SQL)

你可以明確地請求插入跨使用InsertOnSubmit走過來 。或者, LINQ to SQL可以通過 推斷插入連接到 之一的已知對象,該對象必須是 已更新。例如,如果你一個 未跟蹤對象到 EntitySet的(TEntity)已或設置 的EntityRef(TEntity)已添加到未跟蹤 對象,則使未跟蹤對象 到達由在 圖表跟蹤對象的方法。在處理 SubmitChanges時,LINQ to SQL遍歷 跟蹤的對象並發現任何 未被跟蹤的可訪問持久對象 。這些對象是 候選人,用於插入 數據庫。

我想問題歸結爲這 - 如何將刪除的對象的狀態更改爲'Untracked'?

我從列表中刪除對象但嘗試出現異常(無法刪除未連接的實體)後嘗試刪除DeleteSubmit。

有人可以請我指出一個解決方案嗎?謝謝。

我想知道,如果我只能使用LINQ來實現這一點。 (我知道我可以使用存儲過程並只插入列表中的記錄。)

回答

0

我認爲您的列表中的元素沒有被刪除,因爲List.Remove方法使用默認的相等比較器來確定相等性。

如果你不想寫一個自定義比較,我推薦你使用RemoveAll方法,它接收謂詞的第一個參數匹配將從列表中刪除的元素:

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

還是RemoveAt方法,去除基於指定索引的元素:

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

這不是它。列表中的remove()工作正常 - 我持有對要刪除的項目的引用。插入數據庫中的記錄大於列表中的記錄。 – hIpPy 2009-07-31 23:34:00