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
EdmScalarPropertyAttribute的EntityKeyProperty属性及IsNullable 属性