EF 6 System.Data.Objects.ObjectContext 错误

Posted

技术标签:

【中文标题】EF 6 System.Data.Objects.ObjectContext 错误【英文标题】:EF 6 System.Data.Objects.ObjectContext Error 【发布时间】:2012-12-15 21:21:06 【问题描述】:

我最近从 Entities Framework 5 升级到 Entities Framework 6 Alpha 2,我收到以下错误:

找不到方法:'System.Data.Objects.ObjectContext System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext()'。

当我打电话时这会被击中

if (Membership.ValidateUser(model.UserName, model.Password)) 

在不确定为什么会出现此错误之前,这曾经可以正常工作。有什么建议吗?

【问题讨论】:

我建议一个更好的标题。关于此 EF 版本的每个问题都可以使用与您相同的标题。 有一个关于此问题的 Microsoft Connect 错误:connect.microsoft.com/VisualStudio/feedback/details/801350/… @Pawel:这是不正确的。 MVC 不关心 EF。 @Ours - 我实际上认为有些部分确实关心 EF,就像上面链接中提到的那样。 【参考方案1】:

EF 6 没有System.Data.Objects.ObjectContext。 EF 6 已将包括ObjectContext 在内的一些类型从System.Data.Entity.dll 移动到EntityFramework.dll,并更改了它们的命名空间。您收到此错误的事实表明您没有尝试重新编译您的应用程序,您只是替换了EntityFramework.dll 并希望获得最好的结果。那是行不通的。您需要更新代码以使用 EF 6:您需要删除对 System.Data.Entity.dll 的引用,并更新代码以引用新类型。

IObjectContextAdapter.ObjectContext 属性的引用可能在您正在使用的某个库中,但很可能在您自己的代码中。错误消息(在您的问题中未包含的部分)应该告诉您它来自哪里。

【讨论】:

我已经删除了对 System.Data.Entity.dll 的所有引用,我已经重新编译并且没有错误。我看到引用 IObjectContextAdapter.ObjectContext 的唯一内容是在我的 DB.context.TT 文件中。我还需要做什么? 我之前使用的是 EF 5 DBContext Generator,然后我可以将什么用于 EF6? @EF 5 DBContext 生成器仍然可以工作,只要您不使用 SQL Server 存储过程或用户定义的函数。 .Context.tt 中的引用仅在您确实使用它们时使用,但如果您这样做了,您也应该在生成的文件 (.Context.cs) 中看到它们。同样,错误消息应该为您提供更多详细信息,但由于这些详细信息不在问题中,我无法做出合理的猜测。 "找不到方法:'System.Data.Objects.ObjectContext System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext()'。" "来源来自 System.Web.Providers" -- 可能是一个非常相关的位。如果您从 Microsoft.AspNet.Providers.Core (间接)获得它,这取决于 EF5+,并且使用 EF5 中不再以相同形式存在于 EF6 中的方法,则不能将其与 EF6 一起使用,除非您可以找到或创建不同的不使用那些 EF5 方法的版本。【参考方案2】:

对我来说,更新以下内容有效:using System.Data.Objects; --> using System.Data.Entity.Core.Objects;

using System.Data.Objects.DataClasses; --> using System.Data.Entity.Core.Objects.DataClasses;

【讨论】:

【参考方案3】:

我也在使用EF 6

我设法解决了卸载包Microsoft.AspNet.Providers.Core v. 1.2 的问题。我使用的是 1.1 版。如果您像我一样使用LocaDb,则必须卸载LocaDb 包,因为它依赖于该包。当然你得重新安装LocaDb...

您可以使用 Visual Studio 中的 NuGet 包管理器控制台获取 1.1 版:

Install-Package Microsoft.AspNet.Providers.Core -Version 1.1

有一个关于此问题的 Microsoft Connect 错误:

Microsoft.AspNet.Providers.Core incompatible with EF6

【讨论】:

不幸的是,这对我不起作用。我得到了与线程作者相同的错误,除了堆栈跟踪显示它来自 System.Web.Providers.DefaultRoleProvider.GetRolesForUser 调用的 System.Web.Providers.ModelHelper.EnsureDatabaseCreated。 @Roger:我没有删除你的答案。我有足够的声誉来查看您已删除的答案。我只是复制并粘贴了答案中的链接,因为我认为这可能会有所帮助。我认为您的答案已被社区删除,因为它只有 1 个链接,当答案被否决时,它会进入一个池(SO 的评论部分)供其他人查看并决定是否应该关闭它。希望它可以帮助您了解发生了什么。 好的。所以我想像我一样发布链接是不受欢迎的,即使是相关的?我真的不明白。 @Roger:当您想分享这样的链接时,建议您在问题或现有答案下发表评论。有关已删除答案的更多信息,请参见此处:***.com/help/deleted-answers“仅是指向外部站点的链接” Microsoft Connect 链接现已失效。【参考方案4】:

提供程序的新 2.0 版本 (http://www.nuget.org/packages/Microsoft.AspNet.Providers.Core/) 与 EF6 兼容(它们实际上仅适用于 EF6)。

【讨论】:

【参考方案5】:

我设法通过删除我通过 Nuget 安装的 AspNet 提供程序来解决这个问题,这些提供程序被标记为已弃用。这样做也会卸载 Entity Framework。

然后我安装了新的 AspNet Universal Providers,然后安装了 Entity Framework 6,我的所有问题都得到了解决。

【讨论】:

新的提供者?你的意思是1岁的1.2版?还是我错过了什么? 我可能有点落伍了:) 那么,我会报告 1.2 不起作用。 1.1。似乎现在可以工作。【参考方案6】:

查看此链接

http://visualstudiomagazine.com/articles/2014/03/01/whats-new-in-entity-framework-6.aspx

我更新了 EF 6.2 并得到相同的错误并找到解决方案作为休闲

将命名空间 System.Data.Entity 更改为 System.Data.Entity.Core,包括对 System.Data.* 命名空间的任何引用(例如,System.Data.Objects 变为 System.Data.Entity.Core.Objects) .

【讨论】:

【参考方案7】:

当实体框架无法在机器中安装的 dotnet 框架库中找到方法时会发生这种情况。所以安装 dotnet framework 4.5.2 或更高版本。它将解决问题。

【讨论】:

如果这是目标框架,这通常是一个好主意,但它不能直接解决问题。对我来说,我只是修改了 Context.tt 模板文件以排除旧程序集并包含使用 System.Data.Objects。我不确定这是否会解决这里其他任何人的问题。现在如果你卸载 NuGet 包,升级框架,然后安装新的 NuGet 包,我可以看到它工作正常。【参考方案8】:

对我有用的是:

    使用以下命令安装 dll 'Microsoft.AspNet.DataSource':

    PM> 安装包 Microsoft.AspNet.EntityDataSource

    在您的项目中引用“Microsoft.AspNet.DataSource.dll”。

    添加了以下使用声明:

    使用 System.Data.Entity.Core.Metadata.Edm;

    使用 System.Data.Entity.Core.Objects;

    使用 Microsoft.AspNet.EntityDataSource;

    删除了以下使用声明:

    使用 System.Data.Entity;

    使用 System.Data.Metadata.Edm;

    使用 System.Data.Objects;

    使用 System.Web.UI.WebControls;

瞧,代码正在编译和工作。

【讨论】:

【参考方案9】:

它有一个与 edmx 文件相关的旧版本:

使用 Nuget 重新安装 EF 删除 .edmx 文件并使用表重新创建它

【讨论】:

对我来说,我通过 Nuget 获得了 EF6。我在 web 项目中安装了 5.00,它工作正常。【参考方案10】:

对我来说,一个快速简单的解决方法是删除有问题的程序集(已弃用)并添加对新库的引用。代码在 Context.tt 中进行了修改,如下所示:

if (container.FunctionImports.Any())

#>
using System.Data.Entity.Core.Objects; // The assembly you need
using System.Linq;
<#

在进行任何修改之前,它的外观是这样的:

if (container.FunctionImports.Any())

#>
using System.Data.Objects; // Error on compile
using System.Data.Objects.DataClasses; // Error on compile
using System.Linq;
<#

【讨论】:

以上是关于EF 6 System.Data.Objects.ObjectContext 错误的主要内容,如果未能解决你的问题,请参考以下文章

将 IEnumerable 转换为 System.Data.Objects.ObjectSet 时出错

类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义。

Entity Framework 6 将存储过程添加到数据模型后无法构建

LINQ to Entities does not recognize the method 'System.DateTime ToDateTime(System.String)' m

是否可以将 LinqPad 与代码优先模型一起使用

EdmScalarPropertyAttribute的EntityKeyProperty属性及IsNullable 属性