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

Leo*_*ens 44 .net c# ado.net entity-framework entity-framework-6

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

EntityFramework.dll中出现"System.InvalidOperationException"类型的异常,但未在用户代码中处理

附加信息:没有为ADO.NET提供程序找到具有不变名称"System.Data.SqlClient"的实体框架提供程序.确保提供程序已在应用程序配置文件的"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>
Run Code Online (Sandbox Code Playgroud)

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

bcr*_*bcr 47

在我有一个模型项目的情况下我遇到了这个问题,该模型项目包含对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"复制本地"参考设置(与参考的EntityFramework,是安全的),以"假",并保存所有,拿到项目放<Private>将节点放入.csproj文件,然后将其设置回"True"并再次保存,以便True最终作为最终值.

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

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

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

  • 如果可以的话,我会两次投票.将实体框架引用和配置部分保留在UI项目之外正是我所希望的; 谢谢! (3认同)
  • 2017 年 10 月。我们已经登陆火星,发明了伟哥,并且能够用我们的手机捕捉神奇宝贝。我们的科学家,其中最杰出的,仍然无法解决自动复制 DLL 的问题。谢谢,@bcr,你的帮助:) (2认同)
  • 2019年1月,这仍然是一个不错的解决方案。感谢您发布此信息。 (2认同)

Leo*_*ens 35

好的,这很奇怪.我有几个项目:一个是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>
Run Code Online (Sandbox Code Playgroud)

  • 这并不奇怪,你的dll的app.configs没有被添加到dll中,如果你需要配置,你需要将它添加到主app/web.config中.别忘了,这也算是连接字符串 (5认同)

hen*_*anw 15

我有同样的问题,不同的是我没有访问源代码.我已经通过在应用程序的bin目录中放入正确版本的EntityFramework.SqlServer.dll来解决我的问题.


San*_*ndy 13

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

首先 =右键单击您的解决方案或项目根,然后单击Manage NuGet Packages.选择"EntityFramework",选择相应的项目,然后单击"确定".

要么

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

希望能帮助到你.


Mik*_*ikk 6

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

var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
Run Code Online (Sandbox Code Playgroud)

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

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


小智 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成员.