質問: context.Request.Path; //modify context accordingly per path return next(context); }); ``` しかし、 "それに合わせて修正する"ということを正確に狂わせることはできませんでした...そして今、私はStackOverflowの慈悲で自分自身を見つけます...誰もが時間と配慮を非常に感謝しています。どうもありがとう!!!
回答: **TL; DR** :サガパターンは、周囲/データベース関連のトランザクションなしで問題を解決するのに役立ちます。 Sagasもトランザクションですが、ステートマシンに似ています。 > 私のジレンマは、複数のリクエストとDbオペレーションを処理できる*MVCコントローラの*実装ですが、オペレータが必要なプロセスを完了するまで何もコミットしません。 > > それがあなたの最初の誤解です。それがWebとインターネットの仕組みです。 HTTPはステートレスです。 Httpを使用して状態を保存することはできず、1回のリクエストに必要なすべてのデータは、リクエスト自体と共に送信する必要があります。 または、親レコードを永続化し、後で後続の要求で子オブジェクトを追加できるようにデザインを変更します。あるいは、あなたのクライアントがそれらを一緒に送るようにしてください: Json例: ``` { // EF core assigns a new key when the key is null or has the default value parentId: 0, name: "Parent", children: [{ name: "Child 1", },{ name: "Child 2", }] } ``` これで、すべてのデータが1回のリクエストで処理され、1回の操作で処理できます。 jQuery、Angularなどの年齢では、それは問題ではありません。 > これらの子レコードの中には、独自の子を持つものなどがあります。オペレータは、ANYTHINGがコミットされる前に、プロセス全体を処理する必要があります。 > > あなたはデスクトップアプリケーションを開発するときのように考えています。しかし、Webはデスクトップアプリケーションではなく、ステートレスプロトコルとしてhttp経由で状態を転送することはできません。 あなたはあなたのデザインに適応し、よりウェブにやさしいプロセスを使用する必要があります。デスクトップアプリケーションを作成する場合は絶対に必要です。 > このサンプルをコントローラに実装しようと試みた後、 > > > > â€œInvalidOperationException:指定されたトランザクションは、現在の接続に関連付けられていません。現在の接続に関連付けられたトランザクションのみが使用されます。 > > > > > > また、 *最も重要なのは* 、私が熟読しているすべてにおいて、注入された文脈を使用してこれが可能であるかどうかはそれほどではないことを示すようです。何、なぜ? > > トランザクションスコープではなく、それを望む方法ではありません。 TransactionScopeは、一貫性を保証するために複数のデータベース操作を実行するためのものです。これは、データが非同期的に発生し、可能な限り遅れることを意味するものではありません。 > BTW - ここではリポジトリを使用していませんが、ソリューションにリポジトリが必要な場合は、そのアイデアをすべて取り入れています。 > > あなたはリポジトリを使用しています。 EntityFrameworkは、Unit Of WorkおよびRepositoryパターンの実装です。 DbContextは作業単位であり、 `DbSet`プロパティはリポジトリです。 しかし、人々は通常、EF Coreをそれ自身のリポジトリの後ろに抽象化する傾向があります。 DbContextを有効範囲にする必要があるため(またはメモリリークの危険性があるため)、必要な方法では機能しません。また、DbContextはスレッドセーフではないため、単一のスレッドでのみ安全に使用できます。そのため、デフォルトでスコープが設定され、別のスレッドからアクセスしようとすると無効な操作例外がスローされます。 ### 1つのソリューション:Saga / Process Manager 最後に重要なことは、データが任意の順序でいつでも来ることができる長期実行トランザクションがある場合は、手元にパターンがあることです。 プロセスマネージャー/サガと呼ばれています。佐賀またはプロセスマネージャーは長時間実行されるプロセスです。たとえば、1回の操作が今すぐに実行され、2分後に次の操作が実行されます。 3番目のものは1時間もかかります。 サガはステートマシンと同様に動作します。特定の操作を実行するためのメッセージ(コマンド)を受け取り、それを状態(データベース、メモリ、分散キャッシュ、セッション、シナリオに適したもの)に維持します。 次に、未定義の時間が経過した後、2番目のコマンドが来て、その上で何らかの操作を実行します。さらに3番目のコマンド。サガが特定の状態にあるときだけ、全体としてコミットすることができます。 あなたが休暇に行きたいと想像してみてください。今、あなたのフライトとホテルを予約したいと思います。 * 最初の操作は目的地のホテルを選択することです。 * 2番目の操作はフライトを予約することです。 * 今すぐ予約が確定するまで待つ必要があります。航空会社はあなたの支払データを取得し、支払会社に尋ね、貨幣取引が確認されるまで待つ必要があります * フライトが確認されたら、ホテルの部屋を予約したいと考えています。 * ホテルは、支払いの提供者が支払いを確認するまで待つ必要があります。確認が済んだら、ホテルの予約を確認します。 あなたのホテルとフライトの両方が確認された後でさえ、あなたの休暇は "コミット"することができます。たとえば、ホテルの会社がお客様のリクエストを拒否した場合、休暇に行くことはできません。その後、別のコマンド(別のホテルを探す)を発行するか、休暇をキャンセルすることができます。休暇をキャンセルする場合は、フライトをキャンセルする必要があります。 これはトランザクションのロールバックに相当します。 サーガでは、登録されたレコードを削除するか、「vacation saga」を「キャンセル」状態にします。