Sensenet:调用user.save()时,“节点已过期ID”

时间:2018-08-14 09:29:19

标签: c# asp.net sensenet

我尝试尝试更新用户字段,并通过以下代码在Sensenet数据库服务器上对其进行更新

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

在某些情况下,我收到错误消息“节点已过期ID:XXXXX”。

谢谢

1 个答案:

答案 0 :(得分:0)

实际上,在可能同时发生许多事情的环境中,“节点已过期”异常并不是一个真正的错误。这仅意味着与此同时有人(或后台线程)修改了相同的内容。您可以重新加载该节点,然后重试该操作。为此,Sensenet中有一个简单的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),请使用该属性。