如何解决SenseNet中的“Node Out of Date”异常?

时间:2017-03-27 22:50:32

标签: c# sensenet

在各种情况下,相同的操作将导致Node Out of Date Exception。以下是导致此异常的两个单独实例:

  1. 当我更新特定内容项(订单)上的字段时,其他 调用Order.Save()时创建内容(发票)。当我做 一次更新一个项目一切正常。但是,什么时候 我遍历列表,得到NodeIsOutOfDateException。 在循环中加入延迟 - Sleep(1000) - 没有任何区别。
  2. 我创建新的Content,然后在其下面创建子项,保存 创建每个子项之后的父项和子项。什么时候 这个过程完成后,我尝试移动父进程并获取 NodeIsOutOfDateException
  3. 导致此异常的原因是什么以及避免它的最佳做法是什么?

1 个答案:

答案 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.