Sensenet : 'Node is out of date Id'调用user.save()



我正在尝试更新用户的字段,并通过以下代码在sensenet数据库服务器上更新它

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

在某些情况下,我收到错误"节点已过期 Id:XXXXX"。

谢谢

实际上,在可能同时发生许多事情的环境中,"节点已过时"异常并不是真正的错误。这只是意味着在此期间有人(或后台线程(修改了相同的内容。您可以重新加载节点,然后重试该操作。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 方法。或者,如果业务对象上有专用属性(如用户。全名(,请使用它。

相关内容

最新更新