9

.NET 4.5 WCF サービスをアップグレードしました。このサービスには、EF 6 を使用するための OData サービスもあります。OData サービスは、もちろん、アップグレード前に機能していました。ここで、OData サービスにクエリを実行しようとしたり、Visual Studio 2012 から参照したりするだけでも、次のRequest Errorが発生します。

サーバーでリクエストの処理中にエラーが発生しました。例外メッセージは、「型 'System.Data.Entity.Core.Objects.ObjectContext' の式は戻り型 'System.Data.Objects.ObjectContext' には使用できません」です。詳細については、サーバー ログを参照してください。

例外スタック トレースは次のとおりです。

at System.Linq.Expressions.Expression.ValidateLambdaArgs(Type delegateType, Expression& body, ReadOnlyCollection`1 parameters)
at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable`1 parameters)
at System.Data.Services.Providers.DbContextHelper.CreateDbContextAccessor(Type type)
at System.Data.Services.Providers.DbContextHelper.GetDbContextAccessor(Type type)
at System.Data.Services.DataService`1.CreateMetadataAndQueryProviders(IDataServiceMetadataProvider& metadataProviderInstance, IDataServiceQueryProvider& queryProviderInstance, Object& dataSourceInstance, Boolean& isInternallyCreatedProvider)
at System.Data.Services.DataService`1.CreateProvider()
at System.Data.Services.DataService`1.HandleRequest()
at System.Data.Services.DataService`1.ProcessRequestForMessage(Stream messageBody)
at SyncInvokeProcessRequestForMessage(Object , Object[] , Object[] )
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

ODataLib は 5.6、EF は 6.0.1、WCF Data Services サーバーは 5.6 です。

この問題は役に立ちませんでした。私はここからもすべて運が悪いです。へ参照はありませんSystem.Data.Entity。これを乗り越えるにはどうすればよいですか?

4

2 に答える 2

15

WCF Data Services Entity Framework Providerを使用します。

詳細については、Entity Framework 6+ での WCF Data Services 5.6.0 の使用を参照してください。

Entity Framework 6+ での WCF Data Services 5.6.0 の使用

そして、いくつかのエキサイティングなニュースがあります: Entity Framework 6+ で WCF Data Services をついに使用できるようになりました! 本日、 WCF Data Services Entity Framework Providerという新しい NuGet パッケージをアップロードします。この NuGet パッケージは、WCF Data Services 5.6.0 と Entity Framework 6+ の間のギャップを埋めます。最近行ったパブリック プロバイダーの作業により、このプロバイダーを帯域外プロバイダー (つまり、コア WCF DS スタックとは別に出荷されるプロバイダー) として構築することができました。

既存の OData サービスを EF 6 にアップグレードする

既存の OData サービスを Entity Framework 6 以降にアップグレードする場合は、いくつかのことを行う必要があります。

  1. WCF Data Services Entity Framework Provider NuGet パッケージをインストールします。このパッケージは WCF Data Services 5.6.0 および Entity Framework 6 以降に依存しているため、プロジェクト内の他の NuGet パッケージの一部もアップグレードされる可能性があります。
  2. DataService の基本タイプを置き換えます。EF 5 以下の場合、データ サービスは aまたはから継承する必要DataService<T>があります。EF 6 以降の場合、データ サービスはwhere is aから継承する必要があります。詳細については、以下の DataService と EntityFrameworkDataService の違いを参照してください。TDbContextObjectContextEntityFrameworkDataService<T>TDbContext

EF 6 を使用した新しい OData サービスの作成

新しい OData サービスを作成していて、Entity Framework 6 以降を使用したい場合は、同様の手順に従う必要があります。

  1. 新しいプロジェクトを作成します。通常、これには ASP.NET の空の Web アプリケーションを使用しますが、必要なものは何でも使用できます。空のテンプレートを使用する場合は、App_DataEntity Framework が LocalDB で適切に動作するようにフォルダーを作成する必要がある場合があることに注意してください。
  2. WCF Data Services Entity Framework Provider NuGet パッケージをインストールします。このパッケージは WCF Data Services 5.6.0 および Entity Framework 6 以降に依存しているため、プロジェクト内の他の NuGet パッケージの一部もアップグレードされる可能性があります。
  3. 新しい WCF データ サービスを追加します。アイテム テンプレートのバグは時々修正されるため、ツールが最新であることを確認することをお勧めします。最新のツール インストーラーは、WCF DS 5.6.0 でリリースされました。ここからダウンロードできます。
  4. 項目テンプレートによって生成された DataService の基本型を置き換えます。EF 6 以降の場合、データ サービスはEntityFrameworkDataService<T>where Tis aから継承する必要がありDbContextます。詳細については、以下の DataService と EntityFrameworkDataService の違いを参照してください。

DataService<T>とはどう違いEntityFrameworkDataService<T>ますか?

従来、WCF DS スタックでは、すべての WCF DS ベースの OData サービスを から継承する必要がありましたDataService<T>。内部的には、データ サービスは、サービスがインボックス EF プロバイダー、インボックス リフレクション プロバイダー、またはカスタム プロバイダーを使用する必要があるかどうかを決定します。EF 6 のサポートを追加したとき、新しいパブリック プロバイダー機能を利用して、プロバイダーが個別に出荷できるようにしました。これにより、たとえば、EF 5、6、または将来のバージョンで WCF DS 5.6.0 を使用できるようになります。ただし、新しいパブリック プロバイダー機能には、記述が必要なコードが少しあります。そのコードは、すべての既定の EF 6 WCF DS プロバイダーで同じである必要があるため、先に進み、これを行うクラスを含めました。EntityFrameworkDataService<T>から継承DataService<T>他の方法で実装する必要があるすべてのコードを実装します。この追加のクラスを出荷することで、サービスのベース タイプを変更するのと同じくらい簡単にアップグレード プロセスを実行できるようになりました。

于 2013-10-24T13:24:27.123 に答える