簡體   English   中英

錯誤:DbContext已被處置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM