2016-04-25 20 views
3

私はこれらをすべて読んでいるので、あまり役に立たないので、これらのエラーメッセージがたくさんあることは知っています。EF6 DbContextが破棄されたため、操作を完了できません

私は、SQL Server DBからEF6経由で「Persons」のセットを取得しているWebApiコントローラを持っています。非常に簡単な例私がこれまで試した

物事が、成功しません: - プロキシ生成 を無効にする - 遅延ロード を無効にする - 追加LINQと文字列の両方のパラメータを持つ子供、参考文献を取得するには含まれています。 - usingをtry/finally - > DbContextを破棄して置き換えます。

: - WebApiConfig を経由してサポートされているメディアの種類から、「アプリケーション/ XML」を削除 - - 確保循環依存関係は[IgnoreDataMember] に起因している...続き私は覚えていないことができます:)

をここでは、PersonController取得方法であり、

public IEnumerable<Person> Get() 
    { 
     try 
     {    
      IEnumerable<Person> persons = null; 
      using (PersonContext entities = new PersonContext()) 
      { 
       entities.Configuration.ProxyCreationEnabled = false; 
       entities.Configuration.LazyLoadingEnabled = false; 
       persons = entities.Persons.Take(5); 
      } 
      return persons; 
     } 
     catch(Exception ex) 
     { 
      ... 
     }    
    } 

コントローラのANYポイントで例外がスローされることはありません。例外は、しかし、ブラウザに表示されます。

"<Error><Message>An error has occurred.<\Message> 
<ExceptionMessage>The 'ObjectContent`1' type failed to serialize the response body for content type 'application\/json; charset=utf-8'. 
<\ExceptionMessage> 
<ExceptionType>System.InvalidOperationException<\ExceptionType> 
<StackTrace/> 
<InnerException> 
    <Message>An error has occurred.<\/Message> 
    <ExceptionMessage>**The operation cannot be completed because the DbContext has been disposed.**<\/ExceptionMessage> 
    <ExceptionType>System.InvalidOperationException<\/ExceptionType> 
    <StackTrace> at 
     System.Data.Entity.Internal.LazyInternalContext.InitializeContext() 

エラーが何か他のものを使用して句がポップされた後、コンテキストを読み込むしようとしているが、私はそれが何ができるかを知るために途方に暮れてよと言われますか?ご覧のとおり、コンテキストから列挙されたデータをローカルリストにコピーしてから返します。私は詰まった!

感謝の意を表します。

+5

この行の末尾に '.ToList()'を追加してください。 'persons = entities.Persons.Take(5)'と何が起こるかを見てください。 –

+0

確かに。 'IEnumerable <> 'は遅延実行を意味します。この一見無関係な[質問](http://stackoverflow.com/q/36828822/60761)も同じ問題を扱っています。 –

答えて

4

persons = entities.Persons.Take(5); 

データを取得する方法の定義であるが、データ自体はまだその時点(「遅延実行」)で取得されていません。この線はusing(){}構造の内側にあるので、その直後にDbContextが配置されます。後でViewにデータが必要な場合、DbContextは参照されますが、すでに閉じられています。

ソリューション:
DbContextを閉じる前にすべてのデータを取得します。これは多くの場合、ToArray()またはToList()のいずれかが最適です。

ので、ラインは例えばなければなりません:

persons = entities.Persons.Take(5).ToArray(); 
+0

うん、ちょうどこれを発見した。うわー、私はTakeが列挙したと確信していた?とにかく、すばやい返信をありがとう。とても有難い。 – ComeIn

1

persons = entities.Persons.Take(5).ToList()またはToArray

実際にデータをフェッチする前に接続を閉じています。

これで解決しない場合は、dbcontextusing句を削除して、何が起きているかを確認してください。

関連する問題