最近、オブジェクトを適切に破棄するために、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設定されます。このプロパティは、後でメソッドで使用されます。OnAuthorizationAuthorizationContextAuthorizeCore