我在我的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