2012-02-03 16 views
2

以下の状況でオブジェクトを正しく処分する方法を知りたいと思います。これはASP.NET MVCコントローラアクションです。 IDisposableを実装するリポジトリがあります。添付エンティティには関連するエンティティタスクが含まれています。添付ファイルの詳細をクリックすると、正しく表示されます。しかし、タスクをクリックすると、次の例外がスローされます。 "ObjectContextインスタンスが破棄されました..."私は、ビューがレンダリングされると、それが破棄され、ObjectContextが閉じられることを理解しています。オブジェクトを正しく廃棄する方法(ASP.NET MVC + Entity Framework)

public ActionResult Detail(Guid id) 
{ 
    Attachment attachment = null; 
    using (var attachmentRepository = IoC.Resolve<AttachmentRepository>()) 
    { 
     attachment = attachmentRepository.SelectByKey(id); 
     return View("Detail", attachment);    
    }   
}  

このシナリオでは、私の質問は何ですか?

これは良い解決策ですか?この状況でObjectContextはいつ廃止されますか?ユーザーが別のビューに移動したら?またはガベージコレクタが実行されるとき?

public ActionResult Detail(Guid id) 
{ 
    Attachment attachment = null; 
    var attachmentRepository = IoC.Resolve<AttachmentRepository>(); 

    attachment = attachmentRepository.SelectByKey(id); 
    return View("Detail", attachment);        
}  

おかげ

答えて

2

あなたTaskエンティティがあなたの元のクエリの一部として取得されなかった、EFは怠惰なロードしようとしているので、コンテキストが破棄されているので、失敗しています。 Include()クエリを使用して、元のクエリの一部としてTaskエンティティを取得して、後でデータベースに戻る必要がなくなります(これにより、コンテキストを維持する必要があります)。

ここでもIoCを実行していません。Service locator (Anti-) patternを使用しています。 IoCコンテナは、コントローラへのコンストラクタ依存としてリポジトリに渡す必要があります。 IoCコンテナは、次に、リポジトリインスタンスのライフタイム管理を担当する必要があります。

+1

__BrokenGlass__はエンティティの読み込みに 'Include'を使うべきだと言っています。私はViewModelがあなたのデータをViewに渡すほうがよいと思います。ビューにデータを怠ってはいけない理由はいくつかあります:http://nhprof.com/learn/alerts/QueriesFromViews – Andreas

関連する問題