在各种情况下,相同的操作将导致节点过期异常
。以下是导致此异常的两个独立实例:
- 当我更新特定内容项(订单)的字段时,其他调用
Order.Save()
时创建内容(发票)。当我做一次更新一项,一切正常。然而,当我遍历列表,得到一个 NodeIsOutOfDateException
。在循环中加入延迟 -- Sleep(1000)
-- 没有任何区别。
- 我创建了新的
Content
,然后在其下创建子项,保存创建每个子项后,父项和子项都将被创建。什么时候这个过程完成后,我尝试移动父对象并获取NodeIsOutOfDateException
。
导致此异常的原因是什么?避免它的最佳做法是什么?
SenseNet 中的节点在内容存储库中的生命周期是有限的,即使您在源代码中操作的节点对象可以随心所欲地存在。您不能在不考虑时间的情况下创建全局节点变量、加载它并对其执行存储库操作。
通常,当一个新节点出现时,无论是通过加载还是创建,最好按顺序对字段进行所有更新并尽快保存更新的节点。
要解决“节点已过期”异常,只需在导致异常的操作之前重新加载节点即可。保存 Node.Id
整数变量可能有助于加载。
var parent = Node.LoadNode(Order.StoragePath);
Order order = new Order(parent);
// Assign a bunch of fields then save the order.
order.Save();
// Do more operations -- calculate invoices, send emails, etc.
// order Node is now out of date. You must reload it to
// perform Repository operations.
var orderNotOutOfDate = Node.LoadNode(order.Id) as Order;
var archiveFolder = GetArchiveFolder();
order.MoveTo(archiveFolder); // MoveTo fails if Node is out of date.
我是一名优秀的程序员,十分优秀!