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

时间:2009-07-31 20:44:19

标签: linq tracking submitchanges insertonsubmit

我正在使用LINQ在数据库中插入记录。我创建这些记录并使用List跟踪它们。基于某些逻辑,我通过从List中删除来删除一些记录。 (我使用相同的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文章Object States and Change-Tracking (LINQ to SQL)

  

您可以明确请求插入   使用InsertOnSubmit。或者,   LINQ to SQL可以推断插入   找到连接到其中一个的对象   已知的对象必须是   更新。例如,如果添加一个   未跟踪的对象到   EntitySet(TEntity)或设置   EntityRef(TEntity)到Untracked   对象,你制作Untracked对象   可通过跟踪对象访问   图表。在处理时   SubmitChanges,LINQ to SQL遍历   被跟踪的物体并发现任何物体   可达的持久对象   没跟踪。这样的对象是   插入的候选人   数据库中。

我想问题归结为这个问题 - 如何将已删除对象的状态更改为“未跟踪”?

我从列表中删除了对象之后尝试了DeleteOnSubmit,但这会产生异常(无法删除尚未附加的实体)。

有人可以指点我一个解决方案吗?谢谢。

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

1 个答案:

答案 0 :(得分:0)

我认为列表中的元素没有被删除,因为List.Remove方法使用默认的相等比较器确定了相等性。

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

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

RemoveAt方法,根据指定的索引删除元素:

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