1

私のプロジェクトは C# .NET、MVC 5、EF6 です。ObjectDisposedExceptionデータベースから取得したビューでオブジェクトを使用しています。私はおそらくすべての同様の質問を読んだことがありますが、うまくいき.Include()ません。問題は遅延読み込みとは何の関係もないと考えています。

コントローラーメソッド:

public ActionResult Browse()
{
    List<QuestionGroup> questionGroupsWithLinks = new List<QuestionGroup>();
    using (CLASSContext context = new CLASSContext())
    {
        questionGroupsWithLinks = context.QuestionGroup.Include(qg => qg.Questions.Select(q => q.Answers))
            .Where(qg => qg.QuestionGroupID == 128).ToList();
        return View("Browse", questionGroupsWithLinks);
    }
}

私は using ステートメントがビューをラップしないようにしてみましquestionGroupWithLinksた。別の場所で宣言しようとしました。それが読み込まれることを期待して、そのプロパティの 1 つを反復して割り当てようとしましquestionGroupWithLinksた (違いはありませんでした。問題はビューにのみあるため. コントローラーメソッドを使用している限り、常に読み込まれます)、他のことも試しました.

ビュー (簡略化):

@model List<CLASSOnlineAssessments.Models.Assessments.QuestionGroup>
<div class="page-copy">
    @if (Model != null)
    {
        foreach (QuestionGroup qg in Model)
        {
            //More code here; but it always fails before this point.
        }
    }
</div>

Model.First()の代わりに を使用して質問グループにアクセスしようとしましforeachたが、違いはありません。

私が何かを明確にするか、より多くの情報を投稿できるかどうか教えてください.

4

1 に答える 1

3

これを試しましたか?

public ActionResult Browse()
{
    CLASSContext context = new CLASSContext();
    List<QuestionGroup> questionGroupsWithLinks = context.QuestionGroup
        .Include(qg => qg.Questions.Select(q => q.Answers))
        .Where(qg => qg.QuestionGroupID == 128).ToList();
    return View("Browse", questionGroupsWithLinks);
}

これでエラーが発生しない場合は、遅延読み込みの問題のようなにおいがするので、さらにヘルプを提供できるように、エンティティとQuestionGroupエンティティのソースを投稿する必要があります。QuestionAnswer

おそらく、 、、またはビューのレンダリング中に EF がロードしようとしている他のvirtualナビゲーションまたはコレクション プロパティがあります。ただし、コンテキストを破棄したため、EF はそれを遅延読み込みできず、例外をスローします。QuestionGroupQuestionAnswer

ところで、本番環境では上記を使用しないでください。DbContextどういうわけか、リクエストの最後に常に破棄する必要があります。実際には、次のようなことを行う必要があります。

public ActionResult Browse()
{
    using (CLASSContext context = new CLASSContext())
    {
        List<QuestionGroupViewModel> questionGroupsWithLinks = context.QuestionGroup
            .Include(qg => qg.Questions.Select(q => q.Answers))
            .Where(qg => qg.QuestionGroupID == 128)
            .Select(x => new QuestionGroupViewModel
             {
                 Id = x.Id,
                 // ...etc.
             })
            .ToList();
        return View("Browse", questionGroupsWithLinks);
    }
}

上記により、コンテキストにアタッチされたエンティティからすべてのデータを ViewModel データ転送オブジェクトに完全に転送します。ObjectDisposedExceptionエラーが実際に EF から発生している場合、上記により、破棄されたDbContext後にそれ以上何も起こらないことが保証されます。

于 2014-12-31T17:38:38.773 に答える