Я пытаюсь скопировать SPListItem (с файлом) из одного семейства сайтов в другое. Я делаю это, создавая файл так:
var archiveFile = newsArchive.Lists[listName].RootFolder.Files.Add(originalItem.File.Name, originalItem.File.OpenBinary());
var archiveItem = archiveFile.Item;
с помощью служебного метода, который я написал, я затем установил все значения полей нового элемента так, чтобы они соответствовали исходному элементу, например:
Utilities.PopulateListItemMetadata(....)
Дело в том, что это не сохраняется поле Автор.
Я попытался установить поле Author явно во всех мыслимых ситуациях, например, так:
string userName = originalItem.GetUser("Created by").LoginName;
SPUser user = newsArchive.SiteUsers[userName];
archiveItem["Author"] = user.ID + ";#" + user.LoginName;
archiveItem.Update();
И вот так
string userName = originalItem.GetUser("Created by").LoginName;
SPUser user = newsArchive.SiteUsers[userName];
archiveItem["Author"] = user;
archiveItem.Update();
Но как только вызывается метод SPListItem.Update (), поле archiveItem ["Author"] возвращается в sharepoint \ system. Я немного растерялся, это должно сработать ..
P.S. метод SPListItem.GetUser является методом расширения
P.P.S. Код запускается из задания таймера ...
Редактировать: Сделал еще несколько копаний, добавив новое поле к типу контента, а затем установив это поле, чтобы отразить автора оригинального элемента, но это также не задано. Однако web.EnsureUser (имя пользователя) возвращает правильного пользователя. Это странно или как??!