こんにちは、Entity Framework 4.1 コードの最初のアプローチを使用しています。MyContainer
を継承するクラスがありDBContext
ます。
各ステップが多くのリポジトリ メソッド (約 60) にアクセスする 7 つのステップを持つプロセスがあります。このプロセスは、ビジネス ロジックとユーザーの要件に応じて、自動または手動で実行されます。自動プロセスのパフォーマンスの観点から、コンテキスト、つまりMyContainer
一度のオブジェクトを作成し、それをすべてのメソッドに渡し、プロセスの最後に破棄して正常に動作し、パフォーマンスを向上させました.しかし、このプロセスが手動で実行されると、同じメソッドが実行されますコンテナはメソッド自体で作成および破棄されます。以下に例を示しますが、これは大まかなコードです。
public bool UpdateProcess(Process process, MyContainer container = null)
{
bool disposeContainer = false;
if (container == null)
{
container = new MyContainer();
disposeContainer = true;
}
var result = SaveProcess(container, process);
container.SaveChanges();
if (disposeContainer)
container.Dispose();
return result;
}
自動プロセスの場合、トランザクションはプロセスの開始時に作成され、プロセスの終了時に終了します。手動トランザクションの場合、ui のユーザー アクションに従って呼び出されるメソッドの bll で作成されます。自動プロセスが実行されているとします。同時に、ユーザーが ui で何らかのアクションを実行しました"Transaction (Process ID 65)
「別のプロセスでリソースをロックするときに例外がデッドロックされ、選択されました」というメッセージが表示されます UpdateProcess() メソッドが手動プロセスと自動プロセスの両方から一緒に呼び出されると、container.SaveChanges() でそれを取得します.
どんな助けでも大歓迎です。
このリポジトリメソッドでトランザクションスコープを作成すると
public bool UpdateProcess(Process process, MyContainer container = null)
{ bool disposeContainer = false;
if (container == null)
{
container = new MyContainer();
disposeContainer = true;
}
using(var trans=new TransactionScop(TransactionScopeOption.RequiresNew))
{
var result = SaveProcess(container, process);
container.SaveChanges();
trans.Complete();
}
if (disposeContainer)
container.Dispose();
return result;
}
それは正常に動作します。ただし、トランザクションは既に bll で作成されているため、リポジトリにトランザクションを作成したくありません。
どんな助けでも感謝されます。