9

刚刚升级了一个 .NET 4.5 WCF 服务,它也有一个 OData 服务来使用 EF 6。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)

ODataLib 是 5.6,EF 是 6.0.1,WCF 数据服务服务器是 5.6。

这个问题没有帮助。我也从这里完成了所有事情,但没有运气。我没有提及System.Data.Entity. 我能做些什么来克服这个问题?

4

2 回答 2

15

使用WCF 数据服务实体框架提供程序

有关详细信息,请参阅将 WCF 数据服务 5.6.0 与 Entity Framework 6+ 一起使用

将 WCF 数据服务 5.6.0 与实体框架 6+ 一起使用

现在有一些令人兴奋的消息:您终于可以将 WCF 数据服务与 Entity Framework 6+ 一起使用!今天我们将上传一个名为WCF 数据服务实体框架提供程序的新 NuGet 包。此 NuGet 包弥补了 WCF 数据服务 5.6.0 和实体框架 6+ 之间的差距。由于我们最近所做的公共提供程序工作,我们能够将此提供程序构建为带外提供程序(即,与核心 WCF DS 堆栈分离的提供程序)。

将现有 OData 服务升级到 EF 6

如果要将现有的 OData 服务升级到 Entity Framework 6 或更高版本,则需要做几件事:

  1. 安装WCF 数据服务实体框架提供程序NuGet 包。由于此包依赖于 WCF Data Services 5.6.0 和 Entity Framework 6 或更高版本,因此您的项目中的其他一些 NuGet 包也可能会升级。
  2. 替换 DataService 的基本类型。对于 EF 5 或更低版本,您的数据服务应继承自DataService<T>whereT是 aDbContextObjectContext。对于 EF 6 或更高版本,您的数据服务应继承自EntityFrameworkDataService<T>where Tis a DbContext. 有关更多详细信息,请参阅下面的DataService 和 EntityFrameworkDataService 之间的区别

使用 EF 6 创建新的 OData 服务

如果您正在创建新的 OData 服务并希望使用 Entity Framework 6 或更高版本,则需要执行类似的步骤:

  1. 创建您的新项目。我通常为此使用 ASP.NET 空 Web 应用程序,但您可以使用任何您想要的。请注意,如果您确实使用空模板,则可能需要App_Data为实体框架创建一个文件夹才能与 LocalDB 正常工作。
  2. 安装WCF 数据服务实体框架提供程序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 的支持时,我们利用了新的公共提供程序功能来允许提供程序单独发布。例如,这将允许我们将 WCF DS 5.6.0 与 EF 5、6 或某些未来版本一起使用。但是,新的公共提供程序功能附带了一些您需要编写的代码。由于该代码对于每个默认的 EF 6 WCF DS 提供程序都应该是相同的,因此我们继续并包含了一个为您执行此操作的类。EntityFrameworkDataService<T>继承自DataService<T>并实现您需要实现的所有代码。通过发布这个额外的类,我们确实使升级过程变得像更改服务的基本类型一样简单。

于 2013-10-24T13:24:27.123 回答
0

给他人的注意事项;截至 2014 年 6 月,这仍然是一个预发布的 NuGet 包。您需要包含 -Pre 选项才能安装:

PM> 安装包 Microsoft.OData.EntityFrameworkProvider -Pre

于 2014-06-25T14:48:31.360 回答