Gra*_*zer 9 entity-framework wcf-data-services odata
刚刚升级了.NET 4.5 WCF服务,该服务还有一个使用EF 6的OData服务.OData服务当然在升级之前工作.现在,当尝试查询OData服务或甚至只是从Visual Studio 2012浏览它时,我收到以下请求错误:
服务器遇到处理请求的错误.异常消息是'表达式类型'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)
Run Code Online (Sandbox Code Playgroud)
ODataLib为5.6,EF为6.0.1,WCF数据服务服务器为5.6.
tne*_*tne 15
有关详细信息,请参阅将WCF数据服务5.6.0与Entity Framework 6+一起使用.
使用带有Entity Framework 6+的WCF Data Services 5.6.0
现在有一些令人兴奋的消息:您最终可以将WCF数据服务与Entity Framework 6+一起使用!今天我们正在上传一个名为WCF Data Services Entity Framework Provider的新NuGet包.这个NuGet包弥合了WCF数据服务5.6.0和实体框架6+之间的差距.由于我们最近做的公共提供商工作,我们能够将此提供商构建为带外提供商(即,与核心WCF DS堆栈分开的提供商).
将现有OData服务升级到EF 6
如果要将现有OData服务升级到Entity Framework 6或更高版本,则需要执行以下操作:
- 安装WCF数据服务实体框架提供程序 NuGet包.由于此程序包依赖于WCF Data Services 5.6.0和Entity Framework 6或更高版本,因此项目中的某些其他NuGet程序包也可能会升级.
- 替换DataService的基本类型.对于EF 5或更低,数据服务应该继承
DataService<T>哪里T是DbContext或ObjectContext.对于EF大于或等于6,你的数据服务应该继承EntityFrameworkDataService<T>哪里T是DbContext.有关更多详细信息,请参阅下面的DataService和EntityFrameworkDataService之间的区别.使用EF 6创建新的OData服务
如果您要创建新的OData服务并且想要使用Entity Framework 6或更高版本,则需要执行类似的步骤:
- 创建新项目.我通常使用ASP.NET空Web应用程序,但您可以使用任何您想要的.请注意,如果使用空模板,则可能需要
App_Data为Entity Framework 创建一个文件夹才能与LocalDB一起正常工作.- 安装WCF数据服务实体框架提供程序 NuGet包.由于此程序包依赖于WCF Data Services 5.6.0和Entity Framework 6或更高版本,因此项目中的某些其他NuGet程序包也可能会升级.
- 添加新的WCF数据服务.最好是确保您的工具是最新的,因为我们偶尔会修复项目模板中的错误.我们最新的工具安装程序随WCF DS 5.6.0发布.它可以在这里下载.
- 替换项模板生成的DataService的基本类型.对于EF大于或等于6,你的数据服务应该继承
EntityFrameworkDataService<T>哪里T是DbContext.有关更多详细信息,请参阅下面的DataService和EntityFrameworkDataService之间的区别.
DataService<T>和之间有什么区别EntityFrameworkDataService<T>?从历史上看,WCF DS堆栈需要继承所有基于WCF DS的OData服务
DataService<T>.在内部,数据服务将确定服务是否应使用内置EF提供程序,内置Reflection提供程序或自定义提供程序.当我们添加对EF 6的支持时,我们利用新的公共提供程序功能允许提供程序单独发货.例如,这将允许我们将WCF DS 5.6.0与EF 5,6或未来版本一起使用.但是,新的公共提供程序功能需要您编写一些代码.由于该代码对于每个默认的EF 6 WCF DS提供商应该是相同的,因此我们继续并包括一个为您执行此操作的类.EntityFrameworkDataService<T>继承自DataService<T>并实现您需要实现的所有代码.通过发送这个额外的类,我们确实使升级过程像更改服务的基本类型一样简单.