0

私は mvc3 アプリケーションを持っていて、データ アクセスに最初に EF 5 コードを使用しています。次のエラー メッセージが表示されますが、その理由はわかりません。

これがなぜなのか、どうすれば問題を回避できるのかを誰かが説明できますか?

ObjectContext インスタンスは破棄されており、接続を必要とする操作には使用できなくなりました。

私のデータ アクセス コードは次のとおりです。

var list = new List<Task>();

using (var db = new SiteContext())
{
    var queryableAll = db.Tasks.AsQueryable();

    // setup order descending
    queryableAll = (orderByTimeDescending)
            ? queryableAll.OrderByDescending(x => x.Created)
            : queryableAll.OrderBy(x => x.Created);

    list.AddRange(queryableAll
        .Include("Customer")
        .Include("Collection").ToList());

}
return list;

私の見解:

@foreach (var task in Model.Tasks.OrderByDescending(x => x.Created))
{
  Html.RenderPartial("_ProjectLine", task);
}

私の部分的な_ProjectLine

@model ProjectManagement.DataAccess.Models.Task
<tr>
    <td>@Model.TaskId</td>
    <td>
        @Html.ActionLink(Model.Name, "ManageTask", "Task", new { id = Model.TaskId }, null)
    </td>
    <td>
        @Model.Collection.Name
    </td>
    <td>@Model.Customer.Name</td>
</tr>

アップデート:

部分ビューのレンダリング中に例外が発生します。使用を削除して、ガベージコレクターが処分するために残しておくと、うまくいきます。しかし、私はこの解決策が好きではありません。

4

2 に答える 2

2

ページがレンダリングされる前にコンテキストを破棄しています。次に、アクティブなコンテキストを必要とする何かを行う場合 (たとえば、遅延読み込みされたプロパティを参照しますが、他にも多くの例があります。例外のコール スタックを見て、何が原因なのかを確認してください)。このエラー。

これを回避する通常の方法は、コンテキストの有効期間を HTTP リクエストの周りにスコープするように DI コンテナーを構成し、using ブロックで明示的にインスタンス化/破棄するのではなく、コンストラクター インジェクションを使用してコンテキストをメソッドに渡すことです。

例については、 Mark Seeman の著書「Dependency Injection in .NET 」を参照してください。

于 2012-12-29T21:24:28.233 に答える
0

問題の原因については Craig に同意します。これらの問題が発生しないようにする良い方法は、ビューに必要な情報のみを含む単純な POCO ビュー モデル クラスを個別に作成することです。次に、コントローラーにデータを入力し (適切にデータが入力されたことを確認するためのフックも提供します)、それをビューに渡すことができます。ビュー モデル クラスが EF クラスに依存しない場合でも、SiteContext が必要になるリスクはありません。

于 2012-12-30T19:02:10.833 に答える