繁体   English   中英

MVC实体框架-处置DbContext的实例?

[英]MVC Entity Framework - Dispose Instances of DbContext?

我在这里阅读过其他类似的帖子,但仍不清楚。 我希望没有人死掉一些旧东西并希望做出回应,而是希望没人介意重新唤醒一个主题。

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

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

        }

在此示例中,Razor视图引发异常,因为由于使用块,DbContext已被处置。

如果我不处理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>

如果要以此连接到SQL Server(我想是这样),则在连接字符串中添加MultipleActiveResultsets = true。 这允许与SQL Server建立多个打开的数据读取器连接。

更多。

我一直在寻找的答案是DbContext应该始终在Using Block中。 为了防止有关在访问对象时处理DbContext的错误,我需要使用.ToList或.ToArray来实现IEnumerable。

冯的建议实际上是通过使用平面模型来辅助解决方案的另一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM