2011-07-27 10 views
3

"このObjectContextインスタンスは削除されており、接続が必要な操作には使用できなくなりました。asp.net mvc eDを使用したObjectDisposedException

これは、asp.net mvc3、EF4、ms sqlです。 ここでは、2つのドロップダウンとかみそりである:私は...

public IEnumerable<Province> GetAllProvince() 
     { 
      using (var context = DBContext.ObjectContext) 
      { 
       var pros = context.Provinces; 
       return pros; 
      } 
     } 

IndustryServiceは上記と同じである

public class DBContext 
    { 
     private static EmpowerDBEntities _empowerContext; 
     public static EmpowerDBEntities ObjectContext 
     { 
      get 
      { 
       if (_empowerContext == null) 
        _empowerContext = new EmpowerDBEntities(); 
       return _empowerContext; 
      } 
     } 
    } 

<div class="editRow"> 
@Html.DropDownListFor(m=>m.IndustryId, (SelectList)ViewBag.Industry, @Empower.Resource.General.ddlDefaultVal, new { @class = "ddl400" }) 
@Html.ValidationMessageFor(m => m.IndustryId) 
</div> 
<div class="editRow"> 
@Html.DropDownListFor(m=>m.ProvinceId, (SelectList)ViewBag.Province, @Empower.Resource.General.ddlDefaultVal, new {@class = "ddl400"}) 
@Html.ValidationMessageFor(m => m.ProvinceId) 
</div> 

コントローラー:

IndustryService indService = new IndustryService(); 
ViewBag.Industry = new SelectList(indService.GetAllIndustry(), "IndustryId", "IndustryName"); 
ProvinceService proService = new ProvinceService(); 
ViewBag.Province = new SelectList(proService.GetAllProvince(), "ProvinceId", "ProvinceName"); 
return View(); 

ProvinceService知っている以前のクエリによって接続が割り当てられている間にデータを取得しようとすると、2番目のドロップダウンに問題が発生します。これで、お手伝いしてください、ありがとう。

答えて

6

修正は簡単です。使用する前に.ToList()またはFirst()に変換してください。 LINQは実行を延期し、コンテキストが破棄された後(オブジェクト結果が参照されたとき)にこのコマンドを実行しようとしました。実際に呼び出したときではありません。nowのコンテキストが有効範囲内にあるように強制する必要があります。

 
using (var context = DBContext.ObjectContext) 
{ 
    var pros = context.Provinces; 
    return pros.ToList(); 
} 

また、上記のコードでは、getアクセサでnullをチェックしています。しかし、このオブジェクトはnullではありません - それは処分されるので、あなたはこのようにチェックを行うことはできません、あなたはそのnullと廃棄されていないかどうかを確認する必要があります。

 

public class DBContext 
    { 
     private static EmpowerDBEntities _empowerContext; 
     public static EmpowerDBEntities ObjectContext 
     { 
      get 
      { 
       if (_empowerContext == null || _empowerContext.IsDisposed()) 
        _empowerContext = new EmpowerDBEntities(); 
       return _empowerContext; 
      } 
     } 
    } 
 

私は同様の問題に遭遇したとにかくその:)

+0

私はあなたが "返品を使用して提案したことをしました。 – Jack

+0

私の編集を参照してください私は上記の –

+0

にお礼を言いました、私はそれを試みます!しかし、これを実装する他のより良い方法を考えることができます - 2つのドロップダウンリストにデータベースを2回クエリしてポップする – Jack

0

のようなもの。私は、ウェブ上で多くのコード例で見ていたこのパターンは、次のされていた:

public ActionResult Show(int id) 
{ 
    using (var db = new MyDbContext()) 
    { 
     var thing = db.Things.Find(id); 
     return View(thing); 
    } 
} 

しかし、これは上記の説明ObjectDisposedExceptionを引き起こしていた私はメモリにロードされていない何かをアクセスしようとした時はいつでもViewコード(特に、メインビューモデルの1対多の関係)。

私はthis exampleで異なるパターンを見つけました:

public class MyController : Controller 
{ 
    private MyDbContext _db; 

    public MyController() 
    { 
     _db = new MyDbContext(); 
    } 

    public ActionResult Show(int id) 
    { 
     // Do work such as... 
     var thing = _db.Things.Find(id); 
     return View(thing); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     _db.Dispose(); 
     base.Dispose(disposing); 
    } 
} 

ビューがレンダリング終了し、きちんとコントローラー自体が配置されているとき、それを処分するまで、このパターンは、生きているデータベース接続を保持します。コードのブロックは、すべての参照が、それはこのエラーを投げている理由ですので、あなたがlazzyロードしていることに配置されている実行したときに

using(var context=new CustomerContext()) 
{ 

    return View(context.Customers.ToList()); 
} 

を使用しているとき、ここで

0

が問題です。

ので、私は直接、それは完全に正常に動作します

リターンビュー(context.Customers.ToListを())を使用。

関連する問題