我正在使用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来实现这一点。 (我知道我可以使用存储过程并只插入列表中的记录。)
答案 0 :(得分:0)
我认为列表中的元素没有被删除,因为List.Remove方法使用默认的相等比较器确定了相等性。
如果您不想编写自定义比较器,我建议您使用RemoveAll方法,该方法接收谓词作为其第一个参数,以匹配将从列表中删除的元素:
list.RemoveAll( e=> /*condition to remove the element*/ );
或RemoveAt方法,根据指定的索引删除元素:
list.RemoveAt(0); // Delete first element