【发布时间】:2010-11-01 15:33:36
【问题描述】:
我的 BaseController 上有一个名为 DataContext 的属性,它保存我的 LINQ to SQL 数据上下文(或用于测试的假上下文)。当使用无参数构造函数时(换句话说,当向 ASP.NET MVC 发出请求时),我的 LINQ to SQL 数据上下文的新实例被分配给该属性:
public class BaseController : Controller {
public IDataContextWrapper DataContext { get; set; }
public BaseController() : this(new DataContextWrapper<MyDataContext>()) { }
public BaseController(IDataContextWrapper context) {
DataContext = context;
}
}
同样在我的 BaseController 中,我设置了一些全局 ViewData 项:
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
ViewData["Example"] = DataContext.Table<Example>().Count();
base.OnActionExecuting(filterContext);
}
这几乎适用于所有操作。唯一不起作用的是我的 AccountController 上的 Logout 操作:
public ActionResult Logout() {
FormsAuth.SignOut();
return RedirectToResult("Login");
}
这会在 BaseController.OnActionExecuting 期间引发 NullReferenceException。执行该特定操作时,DataContext 属性为空。
为什么这只会发生在一个动作上?
注意: IDataContextWrapper 和 DataContextWrapper 只是包装了 LINQ to SQL DataContext 对象的现有功能,以便在单元测试中可以用假上下文替换它。它自己不会进行任何处理,而是将其留给底层的 DataContext,所以我很确定这不是问题。
【问题讨论】:
-
只是为了验证,您没有重用或持久化 DataContext 是吗? DataContext 应该在一个工作单元内创建并过期。当我做错这件事时,我因奇怪的行为而感到很痛苦。
-
我有一个用于整个控制器的 DataContext 实例,它只分配一次(在创建控制器时),如果这就是你的意思。我可以在其他操作中多次成功访问它(在 OnActionExecuting 和操作方法本身中),但在 Logout 方法的情况下,DataContext 只使用一次(在 OnActionExecuting 中)。
-
好的,这很糟糕,如果它是您问题的原因,我不会感到震惊。不应保留数据上下文。在我的特殊情况下,问题表现为不同的用户看到彼此的数据(真的......有点碍事)。我不能肯定这是你的问题,但我可以向你保证,这是有问题的。
-
你在使用任何类型的 DI 吗?
标签: asp.net-mvc linq-to-sql datacontext