0
  • IoC の構造マップを持つエンティティ フレームワークである asp.net mvc 3 を使用しています。
  • 独自のカスタム メンバーシップ プロバイダーがあります。
  • StructureMapを使用してdbcontextオブジェクトとメンバーシップインスタンスを注入していたときに同じ種類の問題が発生したため、UserRepositoryからこれを削除しました。
  • UserRepository には、コンストラクターで初期化される DBContext プロパティが含まれるようになりました。

新しいユーザーが作成/更新されるたびに (これを行うメソッドは、dbcontext オブジェクトを using ステートメントでラップします)、次に dbcontext が参照されると、ObjectDisposedException がスローされます。

私が間違っていることを理解していません。明らかに、メンバーシップ プロバイダー クラスは必要になるたびに userRepository オブジェクトをインスタンス化するわけではなく、ユーザーが更新されると、using ステートメントのためにコンテキストが破棄されます。しかし、これは標準的な慣行だと思いましたか?

どんな助けでも大歓迎です。

編集:

複雑なコードは実際にはありません。セットアップは次のとおりです。

CustomMembershipProvider は、標準のメンバーシップ プロバイダーをオーバーライドします (構成ファイルに詳細が含まれています)。CustomMembershipProvider は、クラス レベルで DBContext プライベート オブジェクトを持つ UserRepository によって実装される IUserRepository を使用する IUserService オブジェクトを使用します。

UserRepository には、次のものがあります。

    public void UpdateUser(User user)
    {
        using(_db)
        {
            ... code to indicate that the user state has changed
            _db.SaveChanges();
        }
    }

このコードが実行されると、リクエストは完了です。しかし、ロール情報を取得するか、データベースから (UserRepository クラスで) ユーザーを読み取る別の要求が行われると、ObjectDisposedException がスローされます。この時点で、ユーザーまたはロールに関連するものは何も機能しません。これは、_db 変数が UpdateUser によって破棄された同じ UserRepository クラスを使用しているためです。

最初に StructureMap に DBContext オブジェクト、customMembership オブジェクトなどを解決させましたが、それ以降 StructureMap のマッピングから削除する必要がありました。

4

1 に答える 1

3

新しいユーザーが作成/更新されるたびに (これを行うメソッドは、dbcontext オブジェクトを using ステートメントでラップします)、次に dbcontext が参照されると、ObjectDisposedException がスローされます。

DbContextは使い捨てのリソースです (これは を実装しますIDisposable)。したがって、ブロックでラップすると、制御フローがブロックから出たときにusingコンテキストが破棄されusingます。

using(myContext)
{
   //do stuff
}

//try to access myContext after the using block throw ObjectDisposedException

どのように使用しDbContext、いつ廃棄するかを再設計する必要があります。

于 2011-07-10T23:49:30.457 に答える