首页 文章

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

提问于
浏览
472

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

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

enter image description here

30 回答

  • 4

    将以下内容添加到您的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>
    
  • 17

    这些都不适合我 . 我确实在another stackoverflow question找到了解决方案 . 我会在这里添加它以便于参考:

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

    private volatile Type _dependency;
    
    public MyClass()
    {
        _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
    }
    
  • 3

    我今天遇到了这个问题 . 我有数据存储库类库和EF63 NuGet包以及用于测试的控制台应用程序,它们仅参考类库项目 . 我创建了非常简单的post-build命令,它将EntityFramework.SqlServer.dll从类库的Bin \ Debug文件夹复制到控制台应用程序的Bin \ Debug文件夹,问题解决了 . 不要忘记将entityFramework部分添加到控制台应用程序的.config文件中 .

  • 0

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

    综上所述:

    • 类库应用程序:

    • 安装实体框架

    • 编写数据层代码

    • app.config文件具有与实体框架相关的所有配置,连接字符串除外 .

    • 创建控制台,Web或桌面应用程序:

    • 添加对第一个项目的引用 .

    • 添加对EntityFramework.SqlServer.dll的引用 .

    • app.config / web.config具有连接字符串(请记住,配置条目的名称必须与DbContext类的名称相同 .

    我希望它有所帮助 .

  • 185

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

  • 0

    由于消息显示我们需要添加提供程序System.Data.SqlClient,这就是为什么我们需要安装具有两个dll的EntityFramework的nuget包但如果我们只开发控制台应用程序那么我们只需要添加EntityFramework.SqlServer.dll的引用

  • 8

    我几乎尝试了以上所有内容并没有任何效果 .

    只有当我在默认项目 EntityFrameworkEntityFramework.SqlServer 属性 Copy Local 中将引用的DLL设置为 True 时才开始工作!

  • 45

    我有同样的错误 . 奇怪的是,每当我使用dbContext查询任何模型或获取其列表时,它才会发生:

    var results = _dbContext.MyModel.ToList();
    

    我们尝试重新安装实体框架,正确引用它但无济于事 .

    幸运的是,我们尝试检查Nuget的 ALL 解决方案,然后更新所有内容或确保 everything 是相同的版本,因为我们注意到这两个项目在Web项目上有不同的EF版本 . 它有效 . 错误消失了 .

    以下是有关如何为所有解决方案管理Nuget的屏幕截图:

    enter image description here

  • 3

    删除BIN-Folder为我做了

  • 6

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

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

  • 1

    而不是将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");
    }
    

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

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

  • 4

    我需要你的每个人注意两个DLL EntityFramework.dll和EntityFramework.SqlServer.dll是DataAccess图层库在视图或任何其他层中使用它们是不逻辑的 . 它解决了你的问题,但它不符合逻辑 .

    logical way is that enitiess attribute remove and replace them with Fluent API.this is real solution

  • 1

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

  • 1

    您应该强制对EntityFramework.SqlServer.dll程序集进行静态引用,但不是放置虚拟代码,而是可以以更漂亮的方式执行此操作:

    • 如果您已有DbConfiguration类:
    public class MyConfiguration : DbConfiguration
    {
        public MyConfiguration()
        {
            this.SetProviderServices(System.Data.Entity.SqlServer.SqlProviderServices.ProviderInvariantName, System.Data.Entity.SqlServer.SqlProviderServices.Instance);
        }
    }
    
    • 如果您没有DbConfiguration类,则必须在app启动时使用以下代码(在使用EF之前):
    static MyContext()
    {
        DbConfiguration.Loaded += (sender, e) =>
            e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }
    
  • 3

    添加此功能

    private void FixEfProviderServicesProblem()
    

    到库类中的数据库上下文类和缺失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;
            }
        }
    }
    

    .

  • 0

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

    Sometimes above does not work for Test Project

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

    public void FixEfProviderServicesProblem()
    {
        var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
    }
    

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

  • 1

    注意:从模型生成数据库Sql时遇到此问题 . 它创建了所有表格,但不会导出更改 . 您需要注意的是,当您尝试使用DDL生成模板作为SSDLtoSQL10导出sql时会生成此错误 . 它在这里期待MySQL连接,因此请确保从Model属性上的下拉DDL生成模板SSDLtoMySQL中进行选择 . 花了一整天的时间!

  • 0

    我抛出了相同的异常 . 包括我

    using System.Data; 
    using System.Data.Entity;
    

    一切又回来了......

  • 514

    我也有类似的问题 . 我的问题通过以下方式解决:

    enter image description here

    enter image description here

  • 343

    展开YourModel.edmx文件并在YourModel.Context.tt下打开YourModel.Context.cs类 .

    我在使用部分添加了以下行,并为我修复了错误 .

    使用SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;

    每次自动生成文件时,您可能必须将此行添加到文件中 .

  • 2

    我有一个控制台应用程序和类库 . 在类库中,我创建了实体数据模型(右键单击类库>添加>新项>数据> ADO.NET实体数据模型6.0)并将引用放在控制台应用程序中 . 因此,您有控制台应用程序,它引用了类库和内部类库,您有EF模型 . 当我试图从表中获取一些记录时,我遇到了同样的错误 .

    我按照以下步骤解决了这个问题:

    • 右键单击解决方案并选择选项'Manage NuGet Packages for Solution',将显示NuGet包管理器窗口 .

    • 转到'Installed packages'下的'Manage'选项提示:实体框架已添加到类库中,因此您将在'Installed packages'下拥有EntityFramework并且'll see ' Manage'option

    • 点击'Manage'选项并检查安装包到项目,该项目引用了包含EF模型的类库(在我的情况下,我设置复选框将软件包安装到控制台应用程序,该应用程序引用了内置EF模型的类库)

    这就是我必须做的一切,一切都很完美 .

    我希望它有所帮助 .

  • 0

    我刚刚使用Nuget重新安装了Entity Framework . 并按照以下链接中的说明进行操作:http://robsneuron.blogspot.in/2013/11/entity-framework-upgrade-to-6.html

    我认为这个问题会得到解决 .

  • 2

    从CE数据库迁移到Azure上的Sql Server时,我遇到了相关问题 . 只是浪费了4小时试图解决这个问题 . 希望这可以为某人留下类似的命运 . 对我来说,我在packages.config文件中引用了SqlCE . 删除它解决了我的整个问题,并允许我使用迁移 . Yay Microsoft为另一项技术提供了不必要的复杂设置和配置问题 .

  • 0

    我有同样的问题,只是将App Config文件从包含DBContext的项目复制到我的测试项目

  • 42

    在我的情况下,一切正常,然后突然停止工作,因为我认为Resharper改变了导致问题的一些变化 . 我的项目分为数据层,服务和表示层 . 我在我的数据层中安装并引用了Entity框架,但仍然没有错误't go away. Uninstalling and reinstalling didn'工作 . 最后,我通过 making the data layer the Startup project, making migration, updating the database and changing the Startup project back to my presentation layer 解决了它 .

  • 0

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

    [DeploymentItem("EntityFramework.SqlServer.dll")]
    
  • 1

    今天遇到这个问题时,使用一组Web服务,每个服务在不同的项目中,以及一个包含某些服务的集成测试的单独项目 .

    我已经使用EF5一段时间使用此设置,而无需在Integration Test Project中包含对EF的引用 .

    现在,在升级到EF6之后,似乎我需要在集成测试项目中包含对EF6的引用,即使它没有在那里使用(几乎如上所述user3004275) .

    Indications you're facing the same problem:

    • 直接调用EF(连接到数据库,获取数据等)工作正常,只要它们是从引用EF6的项目启动的 .

    • 通过已发布的服务接口调用服务工作正常;即服务中没有遗漏的引用"internally" .

    • 在服务项目中,从服务外的项目调用 directly to public methods 将导致此错误,即使该项目本身未使用EF;仅在被调用项目内部

    第三点是什么让我离开了一段时间,我仍然不确定为什么这是必需的 . 在我的 . 中添加一个ref到EF6集成测试项目无论如何解决了它......

  • 105

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

    • EntityFramework.dll

    • EntityFramework.SqlServer.dll

    <section> 添加到启动项目的.config文件的 <configSections> 上会使该bin目录中的第一个程序集可用 . 您可以从Entity Framework项目的.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>
    

    要使bin文件夹中的第二个.dll可用,虽然不实用,但可以从Entity Framework项目的bin文件夹中进行手动复制 . 更好的选择是向Entity Framework项目的Post-Build事件添加以下行,这将自动化该过程:

    cd $(ProjectDir)
    xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\
    
  • 2

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

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

    PM> Install-Package EntityFramework
    
  • 20

    另外,请确保启动项目是包含dbcontext(或相关app.config)的项目 . 我正在尝试启动一个没有所有必要配置设置的网站项目 .

相关问题