2017-03-27 16 views
1

さまざまな状況下で、同じアクションでNode Out of Date Exceptionが発生します。ここでは、この例外の原因となった二つの別々のインスタンスである:私は、特定のコンテンツ・アイテム(注文)でフィールドを更新するとOrder.Save()が呼び出されたときSenseNetで「Node Out Of Date」例外を解決するにはどうすればよいですか?

  1. 、他の コンテンツは、(請求書)が作成されます。私がしたら 一度に1つのアイテムを更新するとすべて正常に動作します。しかし、 のリストを反復すると、NodeIsOutOfDateExceptionが得られます。 ループに遅延を入れると、Sleep(1000) - 違いはありません。
  2. 新しいContentを作成し、その下に子アイテムを作成し、子アイテムを作成した後に を親と子の両方に保存します。 このプロセスが完了すると、親を移動して NodeIsOutOfDateExceptionを取得しようとします。

この例外の原因は何ですか?回避するにはどうすればよいですか?

答えて

3

SenseNetのノードは、ソースコードで操作するNodeオブジェクトが好きなだけハングアップすることがありますが、コンテンツリポジトリには長寿命です。グローバルなNode変数を作成し、ロードし、時間の心配なしにリポジトリ操作を実行することはできません。

原則として、新しいノードがロードまたは作成されると、すべての更新をフィールドに順次実行し、更新されたノードをできるだけ早く保存することをお勧めします。

「Node Is Out of Date」例外を解決するには、例外を引き起こす操作の直前にノードを再ロードしてください。読み込みを容易にするために整数変数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. 
関連する問題