SPListItem更新时保存冲突

时间:2011-09-22 14:33:22

标签: c# sharepoint-2010

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

在此处获取断点,打开ID = 10001的项目进行编辑,更改“标题”字段并保存。然后运行代码如下:

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

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

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

4 个答案:

答案 0 :(得分:4)

您必须手动检查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);
  // ..
}

我不知道任何其他机制atm。

答案 1 :(得分:2)

  

// * 否则为每个列表修改创建一个新的SPWeb对象   我们将获得Save Conflict *

来自以下网址 http://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;
            }
        }
    }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

当您尝试使用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();
}