I recently made changes to my MVC3 Application in attempt to properly dispose of the DbContext
objects [1]. This worked great in development, but once the application was pushed to my production server, I started intermittently getting some funny exceptions which would persist until the AppPool was recycled. The exceptions can be traced back to code in my custom AuthorizeAttribute
and look like:
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'.
(Database schema looks like this: Users: [Guid, String, ...], Rights: [Guid, Int32, ...])
It is as if some "wires are getting crossed", and the application is mixing up results from the database: trying to materialize the Right
result as a User
and vise versa.
To manage the disposal of DbContext
, I put code in to store this at a per-controller level. When the controller is disposed, I dispose the DbContext
as well. I know it's hacky, but the AuthorizeAttribute
uses the same context via filterContext.Controller
.
Is there something wrong with handling the object lifecycle of DbContext
in this manor? Are there any logical explanations as to why I am getting the crisscross exceptions above?
[1] Although I understand that it is not necessary to dispose of DbContext
objects, I recently came across a number of sources stating that it was best practice regardless.
Edit (per @MikeSW's comment)
A property of the AuthorizeAttribute
representing the DbContext
is being set in the OnAuthorization
method, when the AuthorizationContext
is in scope. This property is then later used in the AuthorizeCore
method.