MVC实体框架-处理DbContext的实例

本文关键字:实例 DbContext -处理 实体 框架 MVC | 更新日期: 2023-09-27 18:04:34

我看过其他类似的帖子,但仍然不清楚。我希望没有人介意重新唤醒一个主题,而不是死去一些旧的东西并希望得到回应。

问题是何时处置DbContext。这是一个控制器在我的MVC应用程序的例子

        public ActionResult Index()
        {
          using (var db = new TheCurve.Models.TheCurveDb())
           {
              var result = db.GetTopArticles().ToList();
              return View(result);
           }
        }

在这个例子中,Razor视图抛出了一个异常,因为DbContext已经被Using块处理了。

如果我不处理DbContext, Razor视图在试图访问模型上的属性(如这段代码)时抛出错误'已经有一个与此命令相关的开放数据读取器'。

var type = Model.ArticleType.Type;
    switch (type)
    {
        case "Example":
            defaultTitleImage = "Content/themes/base/images/example.png";
            break;
        case "Download":
            defaultTitleImage = "Content/themes/base/images/download.png";
            break;
        case "Link":
            defaultTitleImage = "Content/themes/base/images/link.png";
            break;
        case "Article":
            defaultTitleImage = "Content/themes/base/images/article.png";
            break;
    }

我知道DbContext在检索数据后关闭连接,但这是否意味着它不需要处理?

多谢

编辑

显示文章概述的部分视图。

    @model TheCurve.Models.Article

@{
    //Shorten description for Article overview
    var strDescription = Model.Description.Length > 250 ? Model.Description.Substring(0, 250) + "..." : Model.Description + "...";
    //Decide which image to show on overview.
    string defaultTitleImage = null;
    if (Model.TitleImage == null)
    {
        var type = Model.ArticleType.Type;
        switch (type)
        {
            case "Example":
                defaultTitleImage = "Content/themes/base/images/example.png";
                break;
            case "Download":
                defaultTitleImage = "Content/themes/base/images/download.png";
                break;
            case "Link":
                defaultTitleImage = "Content/themes/base/images/link.png";
                break;
            case "Article":
                defaultTitleImage = "Content/themes/base/images/article.png";
                break;
        }
    }
    else
    {
        defaultTitleImage = Model.TitleImage;
    }
}

<article class="clear-fix">
<div class="float-left">
    <img src="@defaultTitleImage" alt="The Curve - Article Type"/>
</div>
<div class="float-left articleoverview">
    @Html.ActionLink(Model.Title.TrimStart(), "Details","Code", new {articleId = Model.Id}, null)
    <p>@strDescription</p>
    <p><i>By @Model.Author On @Model.DateCreated.ToString("dd/MM/yyyy")</i></p>
</div>
</article>

这是使用了上述部分的Razor视图。

@model IEnumerable<TheCurve.Models.Article>
@{
    ViewBag.Title = "Code Samples & Technology Blog";
}
    <section>
        <h3>Currently Viewing Most Recent Entries</h3>
        @foreach (var item in Model)
        {
            @Html.Partial("_ArticleOverview", item)
        }
    </section>

MVC实体框架-处理DbContext的实例

如果你连接到一个SQL服务器与此(我认为是这样),然后添加MultipleActiveResultsets=true在您的连接字符串。这允许多个打开的数据阅读器连接到一个SQL服务器。

我正在寻找的答案是DbContext应该始终在Using块中。为了防止在访问对象时DbContext被处理的错误,我需要使用。tolist或。toarray来具体化IEnumerable。

解决方案的另一部分实际上得到了von的帮助,他建议使用平面模型。