1

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

  1. 当我更新特定内容项(订单)的字段时,Order.Save()会在调用时创建其他内容(发票)。当我一次更新一项时,一切正常。但是,当我遍历列表时,我得到一个NodeIsOutOfDateException. 在循环中放一个延迟 - Sleep(1000)- 没有区别。
  2. 我创建新的Content,然后在它下面创建子项,在创建每个子项后保存父项和子项。此过程完成后,我尝试移动父级并获取 NodeIsOutOfDateException.

是什么导致了这个异常,避免它的最佳实践是什么?

4

1 回答 1

3

SenseNet 中的节点在 Content Repository 中的生命周期是有限的,即使您在源代码中操作的 Node 对象可以随心所欲地挂起。您无法创建全局 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.
于 2017-03-27T22:50:32.020 回答