[英]Error: DbContext has been disposed
public JsonResult JTask(int id)
{
using (TestDb db = new TestDb())
{
var a = db.ToDos.Where(todo => todo.UserId == id);
return Json(a, JsonRequestBehavior.AllowGet);
}
}
我有返回JsonResult
的問題當我運行此代碼時,出現錯誤
“因為
DbContext
已被處置,所以操作無法完成。”
我嘗試按照建議在第3行的末尾添加.ToList()
,但隨后出現錯誤
“序列化類型為System.Data.Entity.DynamicProxies的對象時檢測到循環引用。”
這不是很明顯,但是內置的Json
方法僅在JTask
方法完成執行后才進行序列化。 當然,到那時,上下文已經處理掉,導致您正在描述的原始錯誤。
如果您在Todo
類中具有ICollection<TodoItem>
屬性,則每個屬性都將具有ToDo
屬性,該屬性是對父級的引用。 每個ToDo
屬性還將具有ICollection<TodoItem>
子級,這些子級又具有對父級的引用,依此類推。 這可能會無限循環,並且當序列化程序嘗試序列化對象時,它會放棄循環引用錯誤。
同時解決這兩個問題的一種方法是使用視圖模型。 視圖模型是一個中間類,僅包含模型類具有的屬性的子集。 典型的流程是先將模型類轉換為視圖模型,然后將其序列化為json:
var viewModels = new List<TodoViewModel>();
using (TestDb db = new TestDb())
{
var todoModels = db.ToDos.Where(todo => todo.UserId == id).ToList();
foreach (var model in todoModels)
{
var todoViewModel = new TodoViewModel
{
// Populate viewmodel properties here
Text = model.Text
};
viewModels.Add(todoViewModel);
}
}
return Json(viewModels, JsonRequestBehavior.AllowGet);
我寫了一篇關於使用視圖模型的優勢的博客文章。 如果您有興趣,可以在這里查看: 為什么使用ViewModels
由於LINQ的懶惰是由當時的JSON
試圖獲取數據出來a
(然后才真正進入db
)的db
已被釋放-離開的范圍時using
public JsonResult JTask(int id)
{
using (TestDb db = new TestDb())
{
var a = db.ToDos.Where(todo => todo.UserId == id).ToList();
return Json(a, JsonRequestBehavior.AllowGet);
}
}
var a = db.ToDos.Where(todo => todo.UserId == id).ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.