(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)行锁定要编辑的项目?或者任何其他避免冲突的方法?
答案 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();
}