1

複雑なシナリオを聞く必要があるので、例を挙げて説明します。

次のモデルを検討してください。

public enum States { Created, Approved, Started, Completed }

public class Request {
    States State {get; set;}
    IEnumerable<RequestLine> Lines {get; set;}
}

public class RequestLine {
    States State {get; set;}
    Request Request {get; set;}
    IEnumerable<WorkOrder> WorkOrders {get; set;}
}   

public class WorkOrder {
    States State {get; set;}
    RequestLine RequestLine {get; set;}
    IEnumerable<WorkOrderAction> Actions {get; set;}
}

public class WorkOrderAction {
    States State {get; set;}
    WorkOrder WorkOrder {get; set;}
}

つまり、すべてのレコードには状態があり、それらはすべて接続されています。WorkOrderActionが作成されたら、WorkOrder状態、RequesTLine状態、Request状態の順に更新する必要があります。すべてのWorkOrderActionレコードについて、他の子レコードの状態を確認し、親レコードを更新する必要があります。

これは、データベーストリガーを使用して行うことができますが、これは好ましくありません。私はアプリケーションレベルでDevexpressXAFを使用しているので、そこでいくつかのロジックをコーディングすることもできます。しかし、それでも私はどちらのアプローチが良いかを決めることができません。

リンクされたステートマシンに共通の概念はありますか?

4

3 に答える 3

2

私たちは「他の不完全な子供たち」を知る必要があるだけです。

  1. それらすべてを列挙できます:foreach(parent.Children)if(child.State!= Completed)。ただし、これによりすべてが読み込まれるため、パフォーマンスが低下します。
  2. Execute(new BinaryOperator( "State"、Completed、NotEquals)、AggreagateOperand.Count)のようなものを使用して、データベースへのラウンドトリップを実行できます。これにはドメインの再構築が必要であり、パフォーマンスへの影響は以前のものよりも少なくなります。
  3. 各子が保存/削除/削除/追加されたときに、親の「IncompletedChildren」メンバー(整数)を更新できます。親オブジェクトは常にロードされるため、「IncompletedChildren == 0」のときに親が完了したと判断し、完了としてマークして、親に再帰的に完了を強制できます。トラフィックへの追加のロードはありません(1つの「整数」は「ロード」imhoではありません)。ただし、このアプローチでは、「IncompletedChildren」の更新ごとに「OptimisticLoading」の増分が強制されます。これにより、一部のシナリオではこのアプローチを使用できなくなります。

2番目のアプローチをお勧めします。

PS:私たちのプロジェクト/タスクシステムでは、「Items [State <> Completed] .Count」という式の計算フィールドを導入しました。ただし、これは実際には機能しません。少なくとも私たちのシステムでは、ほとんどの場合、完了状態はそれを意味しませんでした。すべてが完了しました:)

于 2011-09-21T11:19:23.853 に答える
0

私が質問を理解しているかどうかは完全にはわかりませんが、データの整合性「カスケード」(カスケード更新) を強制することについて質問している場合は、コミットが発行されるまで制約チェックのチェックを延期する「延期可能な」制約を設定することを検討します。 . 次に、必要に応じて親/子に更新を行い、コミットします。

Oracleからの延期可能な制約に関するリンクは次のとおりです。

于 2011-09-20T17:47:08.283 に答える
0

一般的な慣行は、実際にはステート マシンとは何の関係もありません。つまり、ステート マシンは、データの整合性規則の適用に関して特別なものではありません。

すべてのユーザーに対して適切に機能する必要がある場合は、トリガーに実装するのが理にかなっています。dbms によって制御されるコードだけが、すべてのユーザーにデータの整合性ルールを適用できます。(そして、すべてのユーザーには、睡眠不足の DBA と彼女のコマンドライン ツールが含まれます。)

于 2011-09-20T17:38:15.653 に答える