【问题标题】:EF 6 System.Data.Objects.ObjectContext ErrorEF 6 System.Data.Objects.ObjectContext 错误
【发布时间】: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,就像上面链接中提到的那样。

标签: c# asp.net-mvc asp.net-mvc-4 azure-sql-database entity-framework-6


【解决方案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:当您想分享这样的链接时,建议您在问题或现有答案下发表评论。有关已删除答案的更多信息,请参见此处:stackoverflow.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】:

        对我有用的是:

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

          PM> 安装包 Microsoft.AspNet.EntityDataSource

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

        3. 添加了以下使用声明:

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

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

          使用 Microsoft.AspNet.EntityDataSource;

        4. 删除了以下使用声明:

          使用 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;
          <#
          

          【讨论】:

            猜你喜欢
            • 2016-10-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-15
            • 2014-06-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多