2011-09-22 63 views
1
(1) var list1 = web.GetList("/lists/list1"); 
(2) var item1 = list1.GetItemById(10001); 
(3) ... 

在此处取得断点,打开ID为10001的项目进行编辑,更改“标题”字段并保存。然后运行代码如下:SPListItem保存冲突,同时更新

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

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

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

回答

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); 
    // .. 
} 

我不知道任何其他机制大气压。

+0

它的工作原理,但我认为它存在更好的方式来锁定项目直接 – devi

0

另一种方法是使用LINQ到SharePoint中的LINQ到SharePoint为您提供一个解决冲突的机制,当您尝试保存您已使用的SubmitChanges方法所做的更改

+2

你能详细说明这一点吗? –

0

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(); 
} 
2

// * 创建每个列表修改,否则 一个新的SPWeb对象我们从以下网址获得保存冲突 *

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; 
      } 
     } 
    } 
} 
+0

好!但那并不总是适用的。例如:两个更新地点需要使用当前的SPContext.CurrentWeb – devi

+0

甚至2年后,您的文章节省了我的(五)天! – Verthosa