首页 文章

错误:找不到具有不变名称的ADO.NET提供程序的实体框架提供程序'System.Data.SqlClient'

提问于
浏览
43

我最近在一个旧项目中将实体框架从版本4或5升级/更新到版本6.现在我得到了这个例外:

EntityFramework.dll中出现“System.InvalidOperationException”类型的异常但未在用户代码中处理附加信息:找不到具有不变名称“System.Data.SqlClient”的ADO.NET提供程序的实体框架提供程序 . 确保提供程序已在应用程序配置文件的“entityFramework”部分中注册 . 有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882 .

我用谷歌搜索了错误并遇到了几个SO线程,但它们都没有包含适用于我的解决方案 . 这是我的App.config看起来像:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

我已经从我的项目中卸载了Entity Framework并重新安装了它,删除了所有对旧EF文件的引用并重新安装,但对我来说没有任何作用 . 我一直收到这个错误 .

13 回答

  • 0

    在我有一个模型项目的情况下我遇到了这个问题,该模型项目包含对EntityFramework和.SqlServer程序集的引用,以及一个使用ASP.NET MVC的单独UI项目 . 我想从EF 4.1升级到6.1 . 我实际上必须完成这里描述的部分内容:http://robsneuron.blogspot.com/2013/11/entity-framework-upgrade-to-6.html . 我想强调的是,我没有向我的UI项目添加对这些项目的引用,也没有将配置添加到UI项目的web.config中,因为这些步骤会违反我关注的问题 .

    我所做的是在我的模型项目中,我不得不将EntityFramework.SqlServer的"Copy Local"引用设置(以及EntityFramework引用,为了安全)转换为"False"并保存所有,以使项目将 <Private> 节点放入 . csproj文件,然后将其设置回"True"并再次保存,以便True最终作为最终值 .

    我还必须在其构造函数中将hack行添加到我的 DbContext -derived类中以强制使用该程序集,即使该行没有执行任何操作 . 我从博客文章中了解到这两个步骤 .

    public MyContext : DbContext
    {
        public MyContext() : base("name=MyContext")
        {
            // the terrible hack
            var ensureDLLIsCopied = 
                    System.Data.Entity.SqlServer.SqlProviderServices.Instance;   
        }
    

    我要感谢我所引用的博客的作者,以及所有询问和回答SO问题的人,试图帮助我们克服这个可怕的错误 .

  • 6

    好的,这很奇怪 . 我有几个项目:一个是UI项目(一个ASP.NET MVC项目),另一个是像存储库这样的项目 . 存储库项目引用了EF,但UI项目没有(因为它不需要一个,它只需要引用其他项目) . 在为UI项目安装EF之后,一切都开始工作了 . 这就是为什么它将这段代码添加到我的Web.config:

    <entityFramework>
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
      <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      </providers>
    </entityFramework>
    
  • 1

    我有同样的问题,不同的是我通过在应用程序的bin目录中放置正确版本的 EntityFramework.SqlServer.dll 来解决我的问题 .

  • 0

    我刚刚解决了您需要在解决方案中再次安装Entity Framework . 遵循任何方法 .

    First =右键单击解决方案或项目根目录,然后单击 Manage NuGet Packages . 选择'EntityFramework',选择相应的项目,然后单击“确定” .

    要么

    Second =转到控制台软件包管理器并运行 Install-Package EntityFramework .

    希望能帮助到你 .

  • 43

    亨德利的回答是100%正确的 . 我的应用程序遇到了同样的问题,其中存储库项目使用封装EF db context操作的方法处理数据库 . 其他项目使用此存储库,我不想在这些项目中引用EF . 不知怎的,我觉得这不合适,我只需要在存储库项目中使用EF . 无论如何,将EntityFramework.SqlServer.dll复制到其他项目输出目录解决了这个问题 . 为避免出现问题,当您忘记复制此dll时,可以更改存储库构建目录 . 转到存储库项目的属性,选择Build选项卡,在output部分中,您可以将输出目录设置为其他项目的构建目录 . 当然,这只是解决方法 . 也许在某些地方提到的黑客更好:

    var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
    

    不过,出于开发目的,这已经足够了 . 稍后,在准备安装或发布时,您可以将此文件添加到包中 .

    我对EF很新 . 有没有更好的方法来解决这个问题?我不喜欢“黑客” - 它让我觉得有些东西“不安全” .

  • 14

    我在DBContext中使用下面的代码解决了这个问题

    public partial class Q4Sandbox : DbContext
        {
            public Q4Sandbox()
                : base("name=Q4Sandbox")
            {
            }
    
            public virtual DbSet Employees { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {           
               var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
            }
        }
    

    感谢SO成员 .

  • 5

    尝试添加以下内容运行时程序集绑定:

    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    
  • 2

    我遇到了同样的问题,唯一对我有用的是使用Uninstall-Package从每个项目中卸载实体框架包 . 然后在整个解决方案中再次安装它 . 它会要求您选择要安装它的项目,您应选择所有项目 .

  • 0

    对我有用的是从 EF 6.1.3 降级到 EF 6.1.1 .

    Visual Studios 2012+ 前往:

    工具 - Nuget包管理器 - 包管理器控制台`

    然后输入:

    Install-Package EntityFramework.SqlServerCompact -Version 6.1.1

    我没有先卸载 EF 6.1.3 ,因为上面的命令已经这样做了 .

    另外,我不知道它是否做了什么,但我也在我的项目中安装了SQL Server CE .

    这是我找到的解决方案的链接:

    http://www.itorian.com/2014/11/no-entity-framework-provider-found-for.html

  • 11

    此问题可能是由于错误的实体框架引用或有时类名称与数据库中的实体名称不匹配 . 确保表名与类名匹配 .

  • 1

    我也有类似的问题

    通过执行以下操作解决了我的问题:

    enter image description here

    enter image description here

  • 2

    将“EntityFramework.SqlServer.dll”添加到bin文件夹中 . 问题将得到解决 .

  • 34

    从NuGet Package Manager中打开 Tools - Nuget Package Manager - Package Manager Console 在每个项目中安装Entity Framework(例如:在Web,In Class Libraries中),并使用 Install-Package EntityFramework 来安装Entity Framework .

    不需要在每个配置文件中添加以下代码 . 默认情况下,它将添加到通过Entity Framework调用数据库的项目中 .

    <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>

相关问题