更新时保存冲突

本文关键字:冲突 保存 更新 | 更新日期: 2023-09-27 18:09:35

(1) var list1 = web.GetList("/lists/list1");
(2) var item1 = list1.GetItemById(10001);
(3) ...

在这里取断点,打开ID = 10001的项目进行编辑,更改'Title'字段并保存它。然后运行如下代码:

(4)item1[SPBuiltInFieldId.Title] = "some text";
(5)item1.Update();

row(5)抛出保存冲突异常。

如何在第(3)行锁定编辑项?或者其他避免冲突的方法吗?

更新时保存冲突

您必须手动检查SPListItem

try
{
  var item = list.GetItemById(3);
  item["MyField"] = "FooBar";
  item.Update();
}
catch(SPException conflictEx)
{
  // handle conflict by re-evaluating SPListItem
  var item = list.GetItemById(3);
  // ..
}

我不知道其他的机制

//*为每个列表修改创建一个新的SPWeb对象我们会得到Save Conflict*

从下面的URLhttp://platinumdogs.me/2010/01/21/sharepoint-calling-splist-update-causes-save-conflict-spexception/

异常
using (var thisWeb = featSite.OpenWeb(featWeb.ID))
        {
            try
            {
                var listUpdate = false;
                var theList = thisWeb.Lists[att.Value];
                // change list configuration
                // .....
                // commit List modifications
                if (listUpate)
                    theList.Update();
            }
            catch
            {
                // log the event and rethrow
                throw;
            }
        }
    }
}

另一种方法是使用Linq to SharePoint, Linq to SharePoint为您提供了冲突解决机制

当你使用SubmitChanges方法保存更改时,SharePoint的LINQ提供程序正在查询并发更改。

当发现冲突时,将抛出ChangeConflictException

foreach(var notebook in spSite.Notebooks)
{
  notebook.IsTopNotebook = true;
}
try
{
  spSite.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch(ChangeConflictException ex)
{
  foreach(ObjectChangeConflict occ in spSite.ChangeConflicts)
  {
    if (((Notebook)occ.Object).Memory > 16)
    {        
      foreach (MemberChangeConflict field in occ.MemberConflicts)
      {
        if (field.Member.Name == "IsTopNotebook")
        {
          field.Resolve(RefreshMode.KeepCurrentValues);
        }
        else
        {
          field.Resolve(RefreshMode.OverwriteCurrentValues);
        }
      }
    }
    else
    {
        occ.Resolve(RefreshMode.KeepCurrentValues);
    }  
  }
  spSite.SubmitChanges();
}