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

时间:2014-02-08 03:14:31

标签: c# .net entity-framework ado.net entity-framework-6

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

  

发生了'System.InvalidOperationException'类型的异常   EntityFramework.dll但未在用户代码中处理

     

其他信息:找不到实体框架提供商   具有不变名称'System.Data.SqlClient'的ADO.NET提供程序。使   确保提供商在“entityFramework”部分注册   应用程序配置文件。看到   http://go.microsoft.com/fwlink/?LinkId=260882了解更多信息。

我用Google搜索了错误并遇到了几个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 :(得分:45)

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

我所做的是在我的模型项目中,我不得不翻转&#34;复制本地&#34; EntityFramework.SqlServer(和EntityFramework引用,为安全)的参考设置为&#34; False&#34;并保存所有,以使项目将<Private>节点放入.csproj文件,然后将其设置回&#34; True&#34;并再次保存,以便True最终成为最终值。

我还必须在我的DbContext派生类的构造函数中添加hack行来强制使用程序集,即使行没有做任何事情。 我从博客文章中了解到这两个步骤。

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

我要感谢我引用的那篇博客的作者,以及所有提出并回答SO问题的人,试图帮助我们克服这个可怕的错误。

答案 1 :(得分:34)

好的,这很奇怪。我有几个项目:一个是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>

答案 2 :(得分:15)

我遇到同样的问题,区别在于我无法访问源代码。 我通过在应用程序的bin目录中放入正确版本的 EntityFramework.SqlServer.dll 来解决我的问题。

答案 3 :(得分:11)

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

首先 =右键单击您的解决方案或项目根目录,然后单击Manage NuGet Packages。选择&#39; EntityFramework&#39;,选择相应的项目,然后点击确定。

第二次 =转到控制台程序包管理器并运行Install-Package EntityFramework

希望它有所帮助。

答案 4 :(得分:6)

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

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

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

我对EF很新。有没有更好的方法来解决这个问题?我不喜欢&#34; hack&#34; - 它让我觉得有些东西是“不安全的”#34;

答案 5 :(得分:5)

我使用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成员。

答案 6 :(得分:2)

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

<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>

答案 7 :(得分:2)

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

答案 8 :(得分:2)

对我有用的是从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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

我也有类似的问题

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

enter image description here

enter image description here

答案 11 :(得分:1)

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

答案 12 :(得分:1)

从NuGet程序包管理器中的每个项目(例如,Web,类库中)安装Entity Framework,或者打开工具-Nuget程序包管理器-程序包管理器控制台,然后使用 Install-Package EntityFramework 以安装实体框架。

不需要在每个配置文件中添加以下代码。默认情况下,它将被添加到通过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>