submitChanges()在linq中插入不需要的记录时出现问题

submitChanges()在linq中插入不需要的记录时出现问题,linq,tracking,submitchanges,insertonsubmit,Linq,Tracking,Submitchanges,Insertonsubmit,我正在使用LINQ在数据库中插入记录。我创建这些记录并使用列表跟踪它们。基于某种逻辑,我通过从列表中删除来删除一些记录。我使用的是相同的DataContext对象 当我想在数据库中插入记录时,我会在datacontext对象上执行相应linq表的InsertOnSubmit,然后进行SubmitChanges。LINQ还会插入从列表中删除的记录以及列表中存在的记录 例如: //list to keep track of records to insert List list // add th

我正在使用LINQ在数据库中插入记录。我创建这些记录并使用列表跟踪它们。基于某种逻辑,我通过从列表中删除来删除一些记录。我使用的是相同的DataContext对象

当我想在数据库中插入记录时,我会在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文章

您可以通过以下方式显式请求插入: 使用InsertOnSubmit。或者, LINQ到SQL可以通过 查找连接到其中一个的对象 必须删除的已知对象 更新。例如,如果添加 未跟踪的对象到 EntitySetEntity或设置一个 对未经跟踪的 对象,则生成未跟踪的对象 可通过中的跟踪对象访问 图表。加工时 提交更改,LINQ到SQL遍历 跟踪对象并发现任何 可访问的持久对象是 没有跟踪。这些物体是 拟加入 数据库

我想问题归根结底是这样的——如何将已删除对象的状态更改为“未跟踪”

在从列表中删除对象后,我尝试了DeleteOnSubmit,但出现了一个异常,即无法删除尚未附加的实体

有人能告诉我一个解决办法吗?谢谢


我想知道我是否可以只使用LINQ来实现这一点。我知道我可以使用存储的进程,只插入列表中的记录。

我认为列表中的元素不会被删除,因为该方法使用默认的相等比较器确定相等

如果您不想编写自定义比较器,我建议您使用该方法,该方法接收谓词作为其第一个参数,以匹配将从列表中删除的元素:

list.RemoveAll( e=> /*condition to remove the element*/ );
或基于指定索引删除元素的方法:

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

不是这样。列表的remove功能正常-我持有对要删除的项的引用。插入到数据库中的记录大于列表中的记录。另外需要注意的是,LINQ to SQL在处理提交更改时遍历被跟踪对象,而不是在添加或删除记录时遍历,并发现任何未跟踪的可访问持久对象。这意味着,即使我在删除不需要的记录时将其状态显式更改为“Untracked”,但在稍后调用submitchange时,它们仍然会被发现。