最近、オブジェクトを適切に破棄するために、MVC3 アプリケーションに変更を加えましたDbContext
[1]。これは開発ではうまく機能しましたが、アプリケーションが実稼働サーバーにプッシュされると、AppPool がリサイクルされるまで持続する面白い例外が断続的に発生し始めました。例外は、私のカスタムのコードにまでさかのぼることができ、次のAuthorizeAttribute
ようになります。
System.InvalidOperationException: The 'Username' property on 'User' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'String'.
System.InvalidOperationException: The 'Code' property on 'Right' could not be set to a 'String' value. You must set this property to a non-null value of type 'Int32'.
(データベース スキーマは次のようになります: ユーザー: [Guid, String, ...], Rights: [Guid, Int32, ...])
まるで「ワイヤーが交差している」ようであり、アプリケーションはデータベースからの結果を混同しています。Right
結果を として実体化しようとしていますUser
。
の破棄を管理するために、DbContext
コントローラーごとのレベルでこれを格納するコードを追加しました。コントローラーが破棄されるときは、コントローラーも破棄DbContext
します。私はそれがハックであることを知っていますが、AuthorizeAttribute
は を介して同じコンテキストを使用しますfilterContext.Controller
。
DbContext
この邸宅でのオブジェクトのライフサイクルの処理に何か問題がありますか? 上記の交差例外が発生する理由について、論理的な説明はありますか?
[1] オブジェクトを破棄する必要がないことは理解していDbContext
ますが、最近、それがベスト プラクティスであると述べている多くの情報源に出くわしました。
編集(@MikeSWのコメントごと)
がスコープ内にある場合、AuthorizeAttribute
を表す のプロパティがメソッドでDbContext
設定されます。このプロパティは、後でメソッドで使用されます。OnAuthorization
AuthorizationContext
AuthorizeCore