使用全局的DataContext 当调用SubmitChanges()
如果这个错误发生过一次,后面的每次操作都会报同样的错误。
设置了断点之后,发现当第一次错误发生后,dc(DataContext) 的 dc.GetChangeSet() 结果里,那个错误结果一直存在,而且这个 dc.GetChangeSet().Inserts / Deletes / Updates 都是只读的,无法直接通过这些东西来取消 之前的操作。
今天又搜了一下,找到个VB.NET的代码,改了改,很好用:
private void CancelDeleteAndInsert(DBDataContext dc) {
ChangeSet ch = dc.GetChangeSet();
foreach( Object ins in ch.Inserts ) {
dc.GetTable(ins.GetType()).DeleteOnSubmit(ins);
}
foreach( Object del in ch.Deletes ) {
dc.GetTable(del.GetType()).InsertOnSubmit(del);
}
}
private void CancelUpdate(DBDataContext dc) {
ChangeSet ch = dc.GetChangeSet();
foreach( Object up in ch.Updates ) {
dc.Refresh(RefreshMode.OverwriteCurrentValues , up);
}
}
调用
------------------------
try {
sr = new CSK_Store_SearchKeywordsRule();
sr.Input = input;
sr.KeywordsID = gw.ID;
dc.CSK_Store_SearchKeywordsRule.InsertOnSubmit(sr);
dc.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);//必须在这里提交,以免后面数据重复.
} catch( Exception ex ) {
MessageBox.Show(ex.Message);
CancelDeleteAndInsert(dc);
CancelUpdate(dc);
dc.SubmitChanges();
}