2011-06-19 28 views
4

我對C#和MVC一般都很陌生,我一直在創建自己的小博客網站作爲測試項目。雖然大多數事情都在努力達到這一點,但我在從LINQ查詢中選擇多個列時遇到了問題。只是在關於這個問題的絆腳石之後,我意識到我可以使用生成的實體類作爲強類型模型來處理這個問題。我需要這個,因爲我一直在創建一個數據庫層(這也是我以前沒有用過的),並試圖通過該層傳遞匿名類型不起作用。我明白爲什麼會這樣,所以我很滿意我正朝着正確的方向前進。MVC 3 - ObjectContext實例已被處置,不能再用於需要連接的操作

但是,這種方法似乎給了我另一個問題。我試過一個簡單的測試,從我的Categories表中檢索2列:CategoryID和Name。我最初嘗試以下內容:

using (MyEntities db = new MyEntities()) 
{ 
    var model = from c in db.Categories 
       select new Category { CategoryID = c.CategoryID, Name = c.Name }; 

    return View(model); 
} 

這給了我ObjectContext處理錯誤,當試圖遍歷視圖中的模型。閱讀this question後,我試圖在模型上移動的return語句,使用塊外,並呼籲AsEnumerable()像這樣:

IEnumerable<Category> model; 

using (MyEntities db = new MyEntities()) 
{ 
    model = from c in db.Categories 
      select new Category { CategoryID = c.CategoryID, Name = c.Name }; 
} 

return View(model.AsEnumerable()); 

然而,這仍然給了我同樣的ObjectContext配置錯誤,當我嘗試遍歷視圖中的模型。所以現在我不明白爲什麼我得到錯誤。我甚至嘗試徹底刪除使用指令,但這給了我一個不同的錯誤:

「實體或複雜類型'MyProjectModel.Category'不能在LINQ to Entities查詢中構造。」

如果有幫助,下面是我的看法相關代碼:

@model IEnumerable<MyProject.Models.Category> 

@foreach (var category in Model) 
{ 
    <p>@category.Name</p> 
} 

會有人好心地開導我,以我缺少什麼嗎?

謝謝。

回答

11

在控制器渴望,爲了安排查詢的執行處置你已經離開了using塊(如後爲時已晚,上下文消失)在緊接之前調用.ToList()

using (MyEntities db = new MyEntities()) 
{ 
    var model = 
     from c in db.Categories 
     select new Category 
     { 
      CategoryID = c.CategoryID, 
      Name = c.Name 
     }; 
    return View(model.ToList()); // <-- .ToList() here 
} 

現在,雖然這可以解決您的特定問題,但開發人員或依賴項注入框架通常會在BeginRequest事件中實例化DbContext,將其存儲在HttpContext.Items中,以便在整個請求執行過程中以及內部EndRequest方法,從中檢索它並配置它。


UPDATE:

此外,它是使用只包含性能視圖模型,你想在這個特殊的視圖中使用一個很好的做法:

public class CategoryViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

,然後你的行動中:

public ActionResult Index() 
{ 
    using (MyEntities db = new MyEntities()) 
    { 
     var model = 
      from c in db.Categories 
      select new CategoryViewModel 
      { 
       Id = c.CategoryID, 
       Name = c.Name 
      }; 
     return View(model.ToList()); 
    } 
} 

並在視圖:

@model IEnumerable<MyProject.Models.CategoryViewModel> 

@foreach (var category in Model) 
{ 
    <p> 
     Id: @category.Id 
     Name: @category.Name 
    </p> 
} 
+0

'.ToList()'是(稍微)更快 – SLaks

+0

嗨達林,謝謝你的迴應,但是這給了我複雜類型無法在LINQ to Entities查詢中構建的錯誤。我不知道它是否有所作爲,但是Category類是我自動生成的,作爲我的實體模型的一部分。 –

+0

@johnh,我真的不熟悉LINQ to Entities,但是無論如何,直接在'using'塊內使用'return View(db.Categories.ToList());'來嘗試。 –

相關問題