2011-12-23 5 views
0
コントローラASP.NET MVC 3でのActionResultメソッドから

をDataContextの廃棄時にエラーが私のコードです:「DataContextの処分後にアクセス」ここ

public ActionResult MainMenu(int id) 
{ 
    using (WebDataContext context = new WebDataContext()) 
    { 
    //var dataLoadOptions = new System.Data.Linq.DataLoadOptions(); 
    //dataLoadOptions.LoadWith<MenuCache>(x => x.Menu); 
    //context.LoadOptions = dataLoadOptions; 

    var menu = context.MenuCaches 
         .AsEnumerable() 
         .Where(x => x.ID == id 
            && (x.Local == true || x.National == true)); 
    foreach (var item in menu) 
    { 
     if (item.Parent.Parent != null && item.Parent.ParentID == 0) 
     { 
     menu = item.Children; 
     } 
    } 
    return View(menu.ToList()); 
    } 
} 

私はそれを修正する方法でオンラインいくつかのオプションを発見しました。 1つはyield return View(menu));を行うことでしたが、それは私にエラーを与えたActionResult is not an iterator。関数内のコメント付きコードは、私が見つけた別のオプションでしたが、それもうまくいきませんでした。何か案は?どうもありがとう。

+0

私はあなたの問題は、あなたがエンティティであり、データコンテキストを破棄する前にロードされていない "MenuCache"のプロパティにアクセスしているということです。 Viewでアクセスされている "MenuCache"のプロパティで、DataLoadOptionsを使用してそれらを読み込むことができるエンティティを確認します。 – epignosisx

答えて

0

私は実際の結果(ビュー)がMVCパイプラインの後半まで実行されないと考えているので、おそらくreturn View(menu.ToList())と関係があるので、ToList()は実行されません。 WebDataContextが処分された後。

public ActionResult MainMenu(int id) 
{ 
    IENumerable<MenuCache> menu; 

    using (WebDataContext context = new WebDataContext()) 
    { 
    menu = context.MenuCaches 
        .AsEnumerable() 
        .Where(x => x.ID == id 
           && (x.Local == true || x.National == true)); 

    foreach (var item in menu) 
    { 
     if (item.Parent.Parent != null && item.Parent.ParentID == 0) 
     { 
     menu = item.Children; 
     } 
    } 
    menu = menu.ToList(); 
    } 
    return View(menu); 
} 
+0

それはそうではありません。まだエラーがあります。 –

+0

うわー、それはおそらく2つのうちの1つです。まず、メニューから別のテーブルに存在するリレーショナルオブジェクトにアクセスしようとしていて、そのオブジェクトを 'LoadWith()'していないか、別の 'WebDataContext'のものです。実際にコントローラではなく、ビューでエラーが発生するはずです。実際のエラースタックのトレースとコードの場所は何ですか(この情報で質問を更新してください)? –

0

ここでは、WebDataContextのレベルをControllerとし、override Dispose()とし、代わりにcontext.Dispose()を呼び出します。

0

あなたが列挙型のリストを作成していて、それで後でクエリを実行できるのではないかと思います。 親の参照が何であるか分からず、そのことは言い難いです。あなたのToListはさらに問い合わせが可能な(そしてあなたの見解にある)項目のリストを作成しています。

ViewModelはこの問題を取り除きますが、リスト内の各項目のルートレベルにまだロードされていないプロパティにアクセスする(リスト項目内の子項目を呼び出すことはありません)

0

ビューにメニューを渡すのは、実際には浅いコピー(ポインタコピー)です。これにより、接続が維持されます。メニューオブジェクトのディープコピーを実行する必要があります。データ・コンテキストでdisposeを直接呼び出すと、ビューにはnullオブジェクトが含まれている可能性があります。

関連する問題