5

一般来说,我对 C# 和 MVC 非常陌生,我一直在创建自己的小博客站点作为测试项目。尽管到目前为止大多数事情都在工作,但我在从 LINQ 查询中选择多个列时遇到了问题。只有在偶然发现关于 SO 的问题后,我才意识到我可以使用生成的实体类作为强类型模型来处理这个问题。我需要这个,因为我一直在创建一个数据库层(这也是我以前没有使用过的东西)并且试图通过该层传递匿名类型不起作用。我理解为什么会这样,所以我很满意我正朝着正确的方向前进。

但是,这种方法似乎给我带来了另一个问题。我尝试了一个简单的测试来从我的类别表中检索 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 is disposed 错误。在阅读了这个问题之后,我尝试将 return 语句移到 using 块之外并在模型上调用 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 is disposed 错误。所以现在我不明白为什么我会收到错误。我什至尝试完全删除 using 指令,但这给了我一个不同的错误:

“无法在 LINQ to Entities 查询中构造实体或复杂类型 'MyProjectModel.Category'。”

如果有帮助,这是我认为的相关代码:

@model IEnumerable<MyProject.Models.Category>

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

有人会善意地告诉我我缺少什么吗?

谢谢。

4

1 回答 1

12

急切地在控制器中调用并.ToList()在处理之前调用,以便在您离开块之前立即安排查询的执行using(因为之后为时已晚,上下文消失了):

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
}

现在,虽然这将解决您的特定问题,但开发人员或依赖注入框架通常做的是实例化事件DbContext内部,将其存储在内部,以便它在整个请求的执行和方法内部可用,从并将其丢弃。BeginRequestHttpContext.ItemsEndRequestHttpContext


更新:

此外,最好使用仅包含您希望在此特定视图中使用的属性的视图模型:

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>
}
于 2011-06-19T20:06:25.330 回答