在各种情况下,相同的操作将导致Node Out of Date Exception
。以下是导致此异常的两个单独实例:
Order.Save()
时创建内容(发票)。当我做
一次更新一个项目一切正常。但是,什么时候
我遍历列表,得到NodeIsOutOfDateException
。
在循环中加入延迟 - Sleep(1000)
- 没有任何区别。Content
,然后在其下面创建子项,保存
创建每个子项之后的父项和子项。什么时候
这个过程完成后,我尝试移动父进程并获取
NodeIsOutOfDateException
。导致此异常的原因是什么以及避免它的最佳做法是什么?
答案 0 :(得分:3)
SenseNet中的节点在内容存储库中具有有限的生命周期,即使您在源代码中操作的Node对象可以随意流动。您不能创建全局Node变量,加载它并在其上执行Repository操作,而不必担心时间。
通常,当新节点通过加载或创建而存在时,最好按顺序对字段执行所有更新并尽快保存更新的节点。
要解决“Node Is Out of Date”异常,只需在导致异常的操作之前立即重新加载Node。保存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.