更新时保存冲突
本文关键字:冲突 保存 更新 | 更新日期: 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();
}