升级到 EF 6 (RTM) - 获取 System.Data.Entity.Core.Objects.ObjectContext 不能用于返回类型 System.Data.Objects

2023-11-23

刚刚升级了 .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)

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

This issue没有帮助。我已经做了一切从here以及没有运气。我有no参考System.Data.Entity。我能做些什么来克服这个问题?


Use the WCF 数据服务实体框架提供商.

See 将 WCF 数据服务 5.6.0 与实体框架 6+ 结合使用了解更多信息。

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

现在有一些令人兴奋的消息:您终于可以将 WCF 数据服务与 Entity Framework 6+ 一起使用!今天我们上传一个新的 NuGet 包,名为WCF 数据服务实体框架提供商。此 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> where T is a DbContext or ObjectContext。对于 EF 6 或更高版本,您的数据服务应继承自EntityFrameworkDataService<T> where T is a DbContext. See 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 一起发布。可以下载here.
  4. 替换由项目模板生成的 DataService 的基本类型。对于 EF 6 或更高版本,您的数据服务应继承自EntityFrameworkDataService<T> where T is a DbContext. See DataService 和 EntityFrameworkDataService 有什么区别请参阅下文了解更多详情。

有什么区别DataService<T> and 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>并实现您需要实现的所有代码。通过提供这个额外的类,我们实际上使升级过程变得像更改服务的基本类型一样简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

升级到 EF 6 (RTM) - 获取 System.Data.Entity.Core.Objects.ObjectContext 不能用于返回类型 System.Data.Objects 的相关文章

随机推荐