2

私が読んだ他の同様の投稿がここにありましたが、まだ明確ではありません. 古いものを壊して反応を期待するのではなく、主題を再び目覚めさせることを誰も気にしないことを願っています.

問題は、DbContext をいつ破棄するかです。これは、私の MVC アプリケーションのコントローラーの例です。

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

        }

この例では、Using Block が原因で DbContext が破棄されたため、Razor ビューは例外をスローします。

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>
4

2 に答える 2

0

これを使用して SQL サーバーに接続している場合 (私はそう推測します)、接続文字列に MultipleActiveResultsets=true を追加します。これにより、SQL サーバーへの複数のオープン データリーダー接続が可能になります。

詳しくはこちらをご覧ください。

于 2013-03-19T09:48:45.500 に答える
0

私が探していた答えは、DbContext が常に Using Block にある必要があるということでした。オブジェクトにアクセスするときに DbContext が破棄されるというエラーを防ぐために、.ToList または .ToArray を使用して IEnumerable を具体化する必要がありました。

ソリューションの他の部分は、フラット モデルの使用を推奨することで、フォンによって実際に支援されました。

于 2013-03-21T08:32:31.680 に答える