我在我的BaseController上有一个名为DataContext的属性,它包含我的LINQ to SQL数据上下文(或用于测试的假上下文)。当使用参数的构造函数(换句话说,当ASP.NET MVC的请求时),我的LINQ to SQL数据上下文的新实例被分配给属性:为什么我的DataContext只有一个动作为null?
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的退出动作:
public ActionResult Logout() {
FormsAuth.SignOut();
return RedirectToResult("Login");
}
这引发BaseController.OnActionExecuting在一个NullReferenceException。在执行该特定操作时,DataContext属性为空。
为什么这只会发生在一个动作?
注: IDataContextWrapper和DataContextWrapper简单地包装了LINQ到SQL DataContext对象的现有功能,以便它可以与在单元测试中假上下文来代替。它不会自行进行任何处理,但会将其留给底层的DataContext,所以我非常确定这不是问题。
只是为了验证,你没有重复使用或持久化DataContext吗? DataContext应该创建并在一个工作单元中过期。当我做错了这件事时,我通过奇怪的行为惹上了很大的麻烦。 – Serapth 2009-06-09 22:41:33
我有一个DataContext的实例为整个控制器只分配一次(当控制器被创建时),如果这就是你的意思。我可以在其他操作(在OnActionExecuting和操作方法本身中)中多次成功访问它,但在注销方法的情况下,DataContext仅使用一次(在OnActionExecuting中)。 – 2009-06-09 22:50:22
好吧,这是不好的,如果这是你的问题的原因,不会让我震惊。数据上下文不应该被持久化。在我的特殊情况下,问题表现为不同的用户看到对方的数据(真的......只是一个节目的一小部分)。我不能肯定地说这是你的问题,但我可以向你保证,这是有问题的。 – Serapth 2009-06-09 23:12:55