我尝试尝试更新用户字段,并通过以下代码在Sensenet数据库服务器上对其进行更新
string strNow = "abc";
var currentUser = (User)User.Current;
currentUser = User.Load("domainname", currentUser.FullName);
currentUser.SetProperty("ExtensionData", strNow);
currentUser.Save();
在某些情况下,我收到错误消息“节点已过期ID:XXXXX”。
谢谢
答案 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),请使用该属性。