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

Fer*_*ozo 524 entity-framework

通过nuget下载EF6并尝试运行我的项目后,它返回以下错误:

没有为ADO.NET提供程序找到具有不变名称"System.Data.SqlClient"的实体框架提供程序.确保提供程序已在应用程序配置文件的"entityFramework"部分中注册.有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882.

在此输入图像描述

dou*_*lps 586

我刚刚陷入同样的​​问题,它看起来像EntityFramework虽然从NuGet包管理器安装没有正确安装在项目中.

我设法通过在Package Manager控制台上运行以下命令来修复它:

PM> Install-Package EntityFramework
Run Code Online (Sandbox Code Playgroud)

  • PMC写道,已经安装了'EntityFramework 6.0.1',但是将它添加到我的控制台应用程序(实际上不使用EF),但它也为我做了伎俩.我从控制台应用程序引用中删除EF,错误返回,我没有得到这个 - 我的控制台应用程序正在使用存储库项目(使用EF)感谢您的帮助! (33认同)
  • 如果解决方案中有多个项目,请不要忘记将-ProjectName <ProjectName>添加到命令行中! (32认同)
  • 同样的问题在这里 我有一个项目没有EF的引用,但EF dll在Debug文件夹中.对此项目运行此命令将"EntityFramework.SqlServer.dll"添加到Debug文件夹 - 问题已解决. (10认同)
  • 在我的情况下,在我将项目部署到测试服务器上之前,此错误并未出现.确实是缺少EntityFramework.SqlServer.dll并通过包管理器安装EF工作.它只是将两个相关的引用添加到项目中,然后将entityFramework设置添加到web.config中.我想本地IIS能够在本地获取程序集,但Web服务器上的完整IIS无法获得权限吗? (4认同)

Clé*_*cou 379

您已将EF添加到类库项目中.您还需要将它添加到引用它的项目(您的控制台应用程序,网站或其他).

  • 这是一个绝对荒谬的答案.为什么我需要这样做呢?你知道什么更荒谬吗?有用. (242认同)
  • 你不必**在控制台/网络应用程序中添加对EF的引用.您只需要确保将`EntityFramework.SqlServer.dll`复制到bin目录.添加强引用可能会破坏您的体系结构(如果您构建了多个层,那么您的顶级执行程序集甚至不应该知道EF).相反,您可以确保复制SQL Server提供程序.例如,参见http://stackoverflow.com/a/19130718/870604 (29认同)
  • 请参阅下面的答案,您无需在控制台应用程序中安装EF. (19认同)
  • 你回答是对的.只将参考EntityFramework.SqlServer.dll添加到使用带EF的库的前端项目,修复问题.所以不要使用这个EF(只有DLL) (7认同)
  • 我怀疑EntityFramework.SqlServer.dll未被检测为依赖的原因是因为Entity Framework动态加载它.当对SQL引用程序的唯一引用位于配置文件中时,您的项目如何知道复制SQL提供程序? (2认同)
  • 只需添加“ typeof(System.Data.Entity.SqlServer.SqlProviderServices);”行即可。进入控制台应用程序以建立依赖关系,并且所有操作均如ken2k所述 (2认同)
  • 对我有用。通常,错误消息与实际问题或解决方案无关。 (2认同)

Fra*_*ein 206

您无需在控制台应用程序中安装Entity Framework,只需添加对程序集EntityFramework.SqlServer.dll的引用即可.您可以将此程序集从使用Entity Framework的类库项目复制到LIB文件夹,并添加对它的引用.

综上所述:

  • 类库应用程序:
    • 安装实体框架
    • 编写数据层代码
    • app.config文件具有与实体框架相关的所有配置,连接字符串除外.
  • 创建控制台,Web或桌面应用程序:
    • 添加对第一个项目的引用.
    • 添加对EntityFramework.SqlServer.dll的引用.
    • app.config/web.config具有连接字符串(请记住,配置条目的名称必须与DbContext类的名称相同.

我希望它有所帮助.

  • 反正还是很荒谬.例如,为什么前端需要引用SqlServer?在我的情况下,前端可能不在乎.但它的确有效.+1 (18认同)
  • 正确答案.无需安装EF.EntityFramework.SqlServer.dll. (17认同)
  • 我必须同意.这完全是正确的答案.参考一个1/2 mb的dll或拉动大于5.5 mb的EF nuget项目.减少建筑多层的价值.来自MS的糟糕表现:我有4层,而我的顶层应该没有理由知道关于EF的任何事情 (14认同)
  • 是! 是!感谢:D (4认同)
  • 这很有帮助.非常感谢. (2认同)
  • 这不会让 EntityFramework 的版本更新变得困难吗?您必须记住去更新对 DLL 的引用 (2认同)

Mik*_*ike 114

如果您忘记包含"EntityFramework.SqlServer.dll",也可以看到此消息.

它似乎是EF6中新添加的文件.最初我没有将它包含在我的合并模块中,并遇到了此处列出的问题.

  • 当我之前有一个项目(a)参与项目(b)时,我遇到了这个问题,该项目引用了EF.清理并删除项目(a)bin文件夹,然后重建后,EF引用遇到,但不是EF.SqlServer.dll.手动复制这个为我工作 (7认同)
  • @dan richardson感谢提到'删除bin文件夹'. (2认同)

And*_*ers 49

不是将EntityFramework.SqlServer添加到主机项目,而是可以确保从模型/实体项目中对它进行静态引用,如下所示

static MyContext()
{
    var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
    if(type == null)
        throw new Exception("Do not remove, ensures static reference to System.Data.Entity.SqlServer");
}
Run Code Online (Sandbox Code Playgroud)

这将使构建过程包括与主机项目的程序集.

更多信息,请访问我的博客 http://andersmalmgren.com/2014/08/20/implicit-dependencies-and-copy-local-fails-to-copy/

  • 我认为这是一个很好的干净解决方案,我们不必在与持久性无关的项目中包含对持久性相关DLL的引用. (5认同)
  • 同意,它适用于任何具有隐式依赖的库,而不仅仅是持久性 (3认同)
  • 当您对程序集中的类型具有显式依赖时,它将由构建过程复制.但是,此处您没有显式依赖项,并且构建过程将无法将程序集复制到构建文件夹.我的代码只是确保存在对所述程序集中任何类型的显式引用. (3认同)
  • 没有它,代码中没有对程序集的显式依赖,也不会将其复制到输出 (2认同)
  • 这太棒了。 (2认同)

Uma*_*bas 47

当您安装Entity Framework 6时Nuget.EntityFramework.SqlServer有时会错过另一个可执行文件.只需将Nuget包添加到该项目即可.

有时上面的测试项目不起作用

要在Test Project中解决此问题,只需将此方法放在Test Project中:

public void FixEfProviderServicesProblem()
{
    var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
Run Code Online (Sandbox Code Playgroud)

从未调用此方法,但正如我的观察,编译器将删除所有"不必要的"程序集,而不使用EntityFramework.SqlServer测试失败的东西.

  • 嗯,这不是很漂亮,但它解决了我在测试项目中遇到的问题.其他解决方案都没有奏效. (2认同)

Joh*_*nes 24

添加此功能

private void FixEfProviderServicesProblem()
Run Code Online (Sandbox Code Playgroud)

将库类中的数据库上下文类和缺少的DLL EntityFramework.SqlServer.dll复制到正确的位置.

namespace a.b.c
{
    using System.Data.Entity;

    public partial class WorkflowDBContext : DbContext
    {
        public WorkflowDBContext()
            : base("name=WorkflowDBConnStr")
        {
        }

        public virtual DbSet<WorkflowDefinition> WorkflowDefinitions { get; set; }
        public virtual DbSet<WorkflowInstance> WorkflowInstances { get; set; }
        public virtual DbSet<EngineAlert> EngineAlerts { get; set; }
        public virtual DbSet<AsyncWaitItem> AsyncWaitItems { get; set; }
        public virtual DbSet<TaskItem> TaskItems { get; set; }
        public virtual DbSet<TaskItemLink> TaskItemLinks { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }

        private void FixEfProviderServicesProblem()
        {
            // The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'
            // for the 'System.Data.SqlClient' ADO.NET provider could not be loaded. 
            // Make sure the provider assembly is available to the running application. 
            // See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
            var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

.


Car*_*rra 19

这些都不适合我.我确实在另一个stackoverflow问题中找到了解决方案.我会在这里添加它以便于参考:

您需要创建一个引用,因此它将被复制到den应用程序路径中.因为稍后它将在运行时引用.所以你不需要复制任何文件.

private volatile Type _dependency;

public MyClass()
{
    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}
Run Code Online (Sandbox Code Playgroud)

  • 这个!无需添加对可能引用此程序集的其他项目的引用. (2认同)

小智 8

我在使用Entity Framework 6和SQL Server Compact 4.0时遇到了同样的错误.有关EF6 实体框架提供程序的 MSDN文章很有帮助.在Package Manager Console中以nuget包的形式运行相应的提供程序命令可能会解决问题,因为NuGet包也会自动将注册添加到配置文件中.我跑去PM> Install-Package EntityFramework.SqlServerCompact解决问题.

  • 到目前为止,我真的很惊讶没人投票!错误消息明确指出:错误的原因是在EF升级之后,应用程序的web.config文件中没有为SQL Compact提供的提供程序定义!添加您提到的包修复了web.config文件,并且将定义提供程序. (2认同)

小智 8

引用正在使用 Entity Framework 的项目的启动项目在其 bin 文件夹中需要以下两个程序集:

  • 实体框架.dll
  • 实体框架.SqlServer.dll

在启动项目的 .config 文件中添加<section><configSections>使该 bin 目录中的第一个程序集可用。您可以从实体框架项目的 .config 文件中复制它:

<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>
Run Code Online (Sandbox Code Playgroud)

为了使 bin 文件夹中的第二个 .dll 可用,虽然不切实际,但可以从实体框架项目的 bin 文件夹中手动复制。更好的替代方法是将以下几行添加到实体框架项目的构建后事件中,这将自动化该过程:

cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我在数据层中有实体框架,因此它是隔离的,但不幸的是,微软不允许我们真正隔离数据层,并让我们用数据库技术污染用户体验。我希望我不必那样做。 (3认同)

小智 7

当测试项目中发生错误时,最漂亮的解决方案是使用以下方法装饰测试类:

[DeploymentItem("EntityFramework.SqlServer.dll")]
Run Code Online (Sandbox Code Playgroud)


Kja*_*tan 6

今天,当使用一组Web服务(每个项目都在不同的项目中)和一个单独的项目(其中包含其中一些服务的集成测试)时,就会遇到这个问题。

我在EF5上使用该设置已有一段时间,而无需包含来自Integration Test Project的EF引用。

现在,在升级到EF6之后,似乎我也需要在集成测试项目中也包括对EF6的引用,即使在那里没有使用它(如上user3004275所指出的那样)。

指示您面临相同的问题:

  • 只要是从引用了EF6的项目中启动,直接调用EF(连接到数据库,获取数据等)就可以正常工作。
  • 通过已发布的服务接口调用服务可以正常工作;即服务中没有“内部”缺少的引用。
  • 从服务之外的项目直接调用服务项目中的公共方法将导致此错误,即使该项目本身未使用EF也是如此。仅在被调用项目内部

第三点是让我离开一会儿的原因,但我仍然不确定为什么要这样做。无论如何,在我的集成测试项目中向EF6添加一个引用都可以解决该问题...


Tar*_*ran 5

将下面添加到您的 app.config。

 <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
Run Code Online (Sandbox Code Playgroud)