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