2016-11-11 4 views
0

デフォルトのVS15テンプレートと "defaultconnection"接続文字列を使用しているasp.net IDで設定されたWeb APIがあります。私はこのソリューションにクラスライブラリを追加しました。その上で私のデータベースからエンティティフレームワークado.netモデルを追加しました。クラスライブラリのapp.configファイルにある接続文字列をWeb設定に追加しました。 APIの別のエンティティフレームワークデータレイヤを持つWeb API

のWeb.config接続文字列:私は私のAPIのコントローラーからユーザー情報のためのGET要求をやろうとしているテストのために

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=MyDatabase;Initial Catalog=Dev;Integrated Security=True" providerName="System.Data.SqlClient" /> 
    <add name="IBPC_DevEntities" connectionString="metadata=res://*/IBPCDataModel.csdl|res://*/IBPCDataModel.ssdl|res://*/IBPCDataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MyDatabase;initial catalog=Dev;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

[Authorize] 
public HttpResponseMessage Get(int id) 
{ 
    using (IBPC_DevEntities entity = new IBPC_DevEntities()) 
    { 
     return Request.CreateResponse(HttpStatusCode.OK, 
      entity.User.FirstOrDefault(u => u.NDBHUserID == id)); 
    } 
} 

私が送りますPostmanのリクエスト(認証トークン付き)InnerExceptionで応答します。「ObjectContextインスタンスが破棄され、接続を必要とする操作には使用できなくなりました。

データベースの最初のEF6を独自のプロジェクトで使用し、defaultconnectionを使用して認証するAPIから参照するにはどうすればよいですか?

+0

私の推測では、遅延読み込みを使用しているので、使用ブロック内から戻ったときに、遅延ロードされたプロパティがフェッチされる前に、ラップされたコンテキストが破棄されています。 [this](http://stackoverflow.com/questions/18398356/how-to-solve-the-error-the-objectcontext-instance-has-been-disposed-and-can-no-l)をチェックしてください。たぶん、これが事実です。 –

+0

デフォルトでは、Entity Frameworkは、特に指定しない限り、Lazy Loadingを使用します。 – Greg

答えて

0

Get --a Userオブジェクトの.NETランタイム空間の戻り値と、APIのコンシューマ側の受け取った値との間には、数多くのミドルウェアがあります。最初に起こることの1つは、UserオブジェクトがJsonとしてシリアル化されていることです。

Jsonシリアライザ(Json.Net)はかなりスマートな獣ですが、ロードされたナビゲーションプロパティとロードされていないナビゲーションプロパティの違いはわかりません。したがって、UserAccountsのようなプロパティがある場合は、そのプロパティをシリアル化しようとします。これは遅延ロードを引き起こし、この悪名高い例外を引き起こします。

クイックフィックスは、遅延読み込みを無効にすることです:

using (IBPC_DevEntities entity = new IBPC_DevEntities()) 
{ 
    entity.Configuration.LazyLoadingEnabled = false; 
    return Request.CreateResponse(HttpStatusCode.OK, 
     entity.User.FirstOrDefault(u => u.NDBHUserID == id)); 
} 

より良い修正がビューモデル/ DTOオブジェクトを使用することです:

return Request.CreateResponse(HttpStatusCode.OK, 
     entity.User.Where(u => u.NDBHUserID == id) 
       .Select(u => new UserDto { Name = u.Name, .... }) 
       .FirstOrDefault()); 

次に、あなたが送信されるかを完全に制御を持っています怠惰なローディングの驚きは起こりません。

+0

ありがとう、私は先に進んでDTOを定義してくれたことを説明してくれてありがとうございました。 –

関連する問題