我最近对我的 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,...],权限:[Guid,Int32,...])
就好像一些“电线正在交叉”,应用程序正在混合来自数据库的结果:试图将Right
结果具体化为 a User
,反之亦然。
为了管理 的处置DbContext
,我将代码放入每个控制器级别存储。当控制器被处置时,我也处置了DbContext
。我知道这很 hacky,但是AuthorizeAttribute
通过filterContext.Controller
.
处理DbContext
这个庄园的对象生命周期有什么问题吗?关于为什么我得到上面的交叉异常有任何合乎逻辑的解释吗?
[1] 虽然我知道没有必要处置DbContext
对象,但我最近遇到了一些消息来源,指出无论如何这是最佳实践。
编辑(根据@MikeSW 的评论)
当在范围内时,AuthorizeAttribute
表示 的属性DbContext
正在方法中设置。该属性随后在该方法中使用。OnAuthorization
AuthorizationContext
AuthorizeCore