Sensenet: «Идентификатор узла устарел» при вызове user.save()

Я пытаюсь обновить поле пользователя и обновить его на сервере базы данных sensnet с помощью кода ниже.

string strNow = "abc";
var currentUser = (User)User.Current;
currentUser = User.Load("domainname", currentUser.FullName);
currentUser.SetProperty("ExtensionData", strNow);
currentUser.Save();

В некоторых случаях я получаю сообщение об ошибке «Идентификатор узла устарел: XXXXX».

Спасибо


person Ankitkumar Tandel    schedule 14.08.2018    source источник


Ответы (1)


На самом деле исключение «Узел устарел» в среде, где одновременно может происходить много вещей, не является настоящей ошибкой. Это просто означает, что тем временем кто-то (или фоновый поток) изменил тот же контент. Вы можете перезагрузить узел и повторить операцию. Для этого в sensnet есть простой retrier API:

Retrier.Retry(3, 10, typeof(NodeIsOutOfDateException), () =>
{
   // execute something that may throw a NodeIsOutOfDateException
   var currentUser = Node.Load(User.Current.Id);
   currentUser["ExtensionData"] = strNow;
   currentUser.Save();
});

В этом случае хорошей практикой является перезагрузка узла, поскольку User.Current может быть закрепленным объектом в фоновом режиме, доступным для нескольких потоков.

Также обратите внимание, что обычно лучше использовать индексатор для доступа к свойствам, а не методы Get/SetProperty, которые предназначены для внутреннего использования. Или, если у бизнес-объекта есть специальное свойство (например, user.FullName), используйте его.

person Miklós Tóth    schedule 14.08.2018
comment
Toth по-прежнему не работает, он пытается три раза, а в третий раз выдает одно и то же исключение. - person Ankitkumar Tandel; 16.08.2018