SPListItem Сохранить конфликт при обновлении - PullRequest
2 голосов
/ 22 сентября 2011
(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 ]

4 голосов
/ 22 сентября 2011

Вы должны проверить 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);
  // ..
}

Я не знаю другого механизма атм.

2 голосов
/ 05 июня 2013

// * создать новый объект SPWeb для каждой модификации списка, в противном случае мы получим Save Conflict *

по следующему URL http://platinumdogs.me/2010/01/21/sharepoint-calling-splist-update-causes-save-conflict-spexception/

1012 * Исключения *

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 голосов
/ 27 августа 2012

Поставщик LINQ SharePoint запрашивает одновременные изменения, когда вы пытаетесь сохранить изменения, сделанные вами с помощью метода SubmitChanges.

При обнаружении конфликта будет выдано 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();
}
0 голосов
/ 22 сентября 2011

Другой подход - использование Linq to SharePoint, Linq to SharePoint предлагает вам механизм разрешения конфликтов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...