#c# #sharepoint #csom
#c# #sharepoint #csom
Вопрос:
В настоящее время я пытаюсь понять, что вызывает конфликт версий в следующих строках. Я провел свое исследование, но большая часть моих поисковых запросов, похоже, указывает на проблему с кэшем. Но я хотел бы конкретно знать, какое из значений поля противоречит предыдущему вызову. Спасибо.
ListItemCreationInformation listItemCreationInfo = new ListItemCreationInformation();
ListItem oListItem = list.AddItem(listItemCreationInfo);
oListItem["Title"] = "HelloFromCode";
oListItem.Update();
context.ExecuteQuery();
string filePath = @"";
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
MemoryStream ms = new MemoryStream();
fs.CopyTo(ms);
AttachmentCreationInformation newFile = new AttachmentCreationInformation { ContentStream = ms, FileName = "Test.docx" };
oListItem.AttachmentFiles.Add(newFile);
oListItem.Update();
context.ExecuteQuery();
Теперь, если я попытаюсь изменить заголовок, не прикрепляя файлы к элементу, это сработает.
oListItem["Title"] = "HelloFromCode2";
oListItem.Update();
context.ExecuteQuery();
Если повторное изменение имени вызывает конфликт версий, это имеет смысл, но работает. Что вызывает путаницу, поскольку я действительно не понимаю основную причину конфликта версий.
И если я удалю первый контекст.ExecuteQuery() , он работает (что имеет смысл, поскольку перед выполнением ничего не было изменено).
Еще раз спасибо.
Комментарии:
1.
context.ExecuteQuery();
Я бы предположил, чтоcontext.ExecuteQuery();
это просто выполняет запрос, он не обновляет значения загруженных элементов списка. Это означает, что номер версии, который вы используете в последующих модификациях, больше не соответствует версии элементов в SharePoint. Это имело бы большой смысл, поскольку CSOM — это просто клиентский API, который работает через очень медленное соединение (HTTP). Клиенты должны вносить как можно больше изменений в один запрос. Это означает, что удаление первогоExecuteQuery
— правильный способ работы2. Если вы не можете внести все изменения сразу (почему?), Вам придется перезагрузить элементы, прежде чем пытаться внести дополнительные изменения.
3. @PanagiotisKanavos Спасибо за ответ. Однако почему, если я меняю заголовок во 2-й раз, это работает? Если мой первый ExecuteQuery() изменяет версию, то второй раз также должен вызвать конфликт версий. Чтобы ответить «невозможно внести все изменения сразу», да, предыдущая реализация нашей библиотеки на самом деле не соответствует лучшим практикам CSOM. Будет стремиться улучшить его.