444

我正在尝试在当前安装在我的机器上的 TeamCity 上运行我的测试。

System.InvalidOperationException

无法加载' ' ADO.NET 提供程序System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer的实体框架提供程序类型 ' 。确保提供程序程序集可用于正在运行的应用程序。Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'System.Data.SqlClient

有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882

我在我的任何项目中都没有参考System.Data.Entitycodeplex 上建议的升级到 EF6 的内容。

所以,我不确定为什么会出现这个异常。当我从 VS 运行测试时,我没有遇到任何此类异常。

我确实尝试将 CopyLocal 设置为 false 然后再次设置为 true .. 但这似乎也不起作用。

更新

我的 app.config 有以下内容。这会导致一些我不理解的行为吗?

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

我在 teamcity 得到以下堆栈跟踪。

[MSTest] IntegrationTests.CrudTest+QuestionTest.Create
[03:59:11][IntegrationTests.CrudTest+QuestionTest.Create] Initialization method IntegrationTests.CrudTest+QuestionTest.Initialize threw exception. System.InvalidOperationException: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 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..
[03:59:11]
[IntegrationTests.CrudTest+QuestionTest.Create]     at System.Data.Entity.Config.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName)
   at System.Data.Entity.Config.ProviderServicesFactory.GetInstanceByConvention(String providerInvariantName)
   at System.Data.Entity.Config.DefaultProviderServicesResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.CachingDependencyResolver.<>c__DisplayClass1.<GetService>b__0(Tuple`2 k)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at System.Data.Entity.Config.CachingDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.Config.ResolverChain.GetService(Type type, Object key)
   at System.Data.Entity.Config.RootDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.Config.ResolverChain.GetService(Type type, Object key)
   at System.Data.Entity.Config.CompositeResolver`2.GetService(Type type, Object key)
   at System.Data.Entity.Config.IDbDependencyResolverExtensions.GetService[T](IDbDependencyResolver resolver, Object key)
   at System.Data.Entity.Config.InternalConfiguration.GetService[TService](Object key)
   at System.Data.Entity.Config.DbConfiguration.GetService[TService](Object key)
   at System.Data.Entity.Utilities.DbProviderFactoryExtensions.GetProviderServices(DbProviderFactory factory)
   at System.Data.Entity.Infrastructure.DefaultManifestTokenService.GetProviderManifestToken(DbConnection connection)
   at System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest)
   at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
   at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
   at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
   at System.Data.Entity.DbSet`1.Add(TEntity entity)
   at EFRepository.Infrastructure.EFRepository`1.Add(T item) in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\Repository\Infrastructure\EFRepository.cs:line 22
   at IntegrationTests.CrudTest.Initialize() in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\IntegrationTests\CrudTest.cs:line 34
4

34 回答 34

442

同样的问题,但我通过 Nuget 安装了 EF 6。另一个可执行文件缺少 EntityFramework.SqlServer。我只是将 nuget 包添加到该项目中。

于 2013-03-12T10:39:50.923 回答
282

我在我的测试项目中遇到了同样的问题 - 我通过 NuGet 安装了最新的 EF6 位,每次我调用与 EF 相关的东西时,我都会得到:

无法加载“System.Data.SqlClient”ADO.NET 提供程序的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer”。确保提供程序程序集可用于正在运行的应用程序。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882

我的解决方法:我将此方法放在我的测试项目中:

public 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;
}

从未调用过此方法,但我认为编译器将删除所有“不必要的”程序集,并且在不使用 EntityFramework.SqlServer 的情况下测试失败。

无论如何:在我的机器上工作;)

注意:您可以确保从您的模型/实体项目中对 SqlProviderServices 进行静态引用,而不是添加测试项目的方法

于 2013-10-02T05:50:00.333 回答
113

Nuget 会将您的 EF6 项目配置为引用 EntityFramework.SqlServer.dll。这会在构建期间部署到 EF6 项目的输出文件夹,但不会部署到引用 EF6 项目的项目的输出文件夹。我相信这是因为 Visual Studio 足够“智能”,可以检测到您的程序集中没有任何东西实际上是直接使用 dll,因此不包含它。您可以通过将代码添加到使用 EntityFramework.SqlServer.dll 的 EF6 项目来强制将 EntityFramework.SqlServer.dll 部署到引用您的 EF6 项目(单元测试、UI 等)的项目的输出文件夹。请注意不要将代码放在生成的类中,因为您可能会在下一次重新生成时丢失它。我选择将以下类添加到程序集中,从而解决了问题。

using System.Data.Entity.SqlServer;

internal static class MissingDllHack
{
    // Must reference a type in EntityFramework.SqlServer.dll so that this dll will be
    // included in the output folder of referencing projects without requiring a direct 
    // dependency on Entity Framework. See http://stackoverflow.com/a/22315164/1141360.
    private static SqlProviderServices instance = SqlProviderServices.Instance;
}
于 2014-03-11T02:14:45.583 回答
45

我的解决方案是通过 nuget 管理器从项目中删除实体框架并将其重新添加。

于 2015-02-06T16:10:42.297 回答
33

我通过在我的 DBContext 类顶部添加一个 using 语句解决了这个问题,如下所示:

using SqlProviderServices= System.Data.Entity.SqlServer.SqlProviderServices;
于 2015-12-27T18:55:14.217 回答
20

我已经为提供者使用了基于代码的注册。 链接1 链接 2

刚刚创建了配置类

class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        this.SetDatabaseInitializer(new DropCreateDatabaseAlways<MyDbContext>());
        this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}

关键是this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);

并以这种方式使用它

[DbConfigurationType(typeof(DbContextConfiguration))]
public class MyDbContext : DbContext
{
    public MyDbContext()
    {
        ...
    }

    public DbSet<...> ...{ get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ...
    }
}
于 2013-11-01T11:10:47.390 回答
15

我在我的程序集初始化类中使用 [DeploymentItem] 对其进行了整理

namespace MyTests
{
    /// <summary>
    /// Summary description for AssemblyTestInit
    /// </summary>
    [TestClass]
    [DeploymentItem("EntityFramework.SqlServer.dll")]
    public class AssemblyTestInit
    {
        public AssemblyTestInit()
        {
        }

        private TestContext testContextInstance;

        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        [AssemblyInitialize()]
        public static void DbContextInitialize(TestContext testContext)
        {
            Database.SetInitializer<TestContext>(new TestContextInitializer());
        }
    }
}
于 2014-09-25T10:32:43.877 回答
10

我有问题,因为我没有添加对 EntityFramework.sqlServer.dll 的引用。当我开发程​​序时,它可以工作。但是当我发布应用程序并安装它时,它会抛出错误。

我只是添加参考并再次构建和发布。

参考

于 2015-03-01T21:10:41.083 回答
10

派对迟到了,但投票率最高的答案对我来说似乎都是黑客行为。

我所做的只是从测试项目中的 app.config 中删除以下内容。工作。

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
于 2016-06-13T19:22:59.923 回答
5

我已经通过手动将EntityFramework.SqlServer.dll文件复制到bin folder主应用程序来解决这个问题。

于 2016-05-04T06:12:57.097 回答
4

我终于解决了这个问题。事实证明,我的存储库类中有一个错误的 IDIsposable 实现。我修好了。错误的实现导致了 stackoverflow 异常,因为我没有正确处理资源。这导致 VS 无法运行测试,测试执行引擎崩溃。

我在这里向微软提交了它(这是在我得到正确的解决方案之前)。 connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details

无论如何,现在构建在 teamcity 上运行良好。虽然,我仍然很好奇为什么 VS 测试执行引擎都没有优雅的方式告诉我发生了什么,而不是 Team City。

我通过手动调试测试发现了根本原因(经过这么多天我才意识到,修复花了我 5 秒)。

希望这将帮助遇到此类问题的人。

于 2013-01-12T19:35:02.273 回答
4

我看到类似的问题,并使用这篇文章中的方法:(http://entityframework.codeplex.com/workitem/1590),它解决了我的问题。

要解决此问题,您可以通过在测试程序集的任何位置添加类似这样的行来使您的测试程序集直接引用提供程序程序集: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

于 2014-06-16T04:11:54.053 回答
4

我有同样的问题我尝试了很多次但它没有解决但是当我安装包 EntityFramework.SqlServerCompact 它解决了从 Nuget 包管理器安装这个包。

Install-Package EntityFramework.SqlServerCompact
于 2018-01-26T11:32:27.997 回答
4

我创建了一个静态“启动”文件并添加了代码以强制将 DLL 复制到其中的 bin 文件夹中,以此作为分隔此“配置”的一种方式。


[DbConfigurationType(typeof(DbContextConfiguration))] public static class Startup { }

public class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        // This is needed to force the EntityFramework.SqlServer DLL to be copied to the bin folder
        SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}

于 2018-07-25T11:14:07.577 回答
3

当我检查问题时,我注意到输出文件夹中缺少以下 dll。如果应用程序处于调试模式,简单的解决方案是将 Entityframework.dll 和 Entityframework.sqlserver.dll 与 app.config 复制到输出文件夹。同时将app.config的构建选项参数“Copy to output folder”更改为始终复制。这将解决您的问题。

于 2015-01-21T04:55:52.110 回答
3

只需引用或浏览 EF dll - EntityFramework.SqlServer.dll

于 2016-06-09T19:01:29.727 回答
3

在尝试了所有其他建议的解决方案并且没有让我的项目工作之后,我终于在这个页面中找到了一点评论:

删除 BIN 文件夹为我做了

它也对我有用。

于 2018-01-31T11:45:31.770 回答
2

我不想在我的应用程序项目中引用 EF(或手动复制任何内容),因此我将其添加到我的 EF 项目的构建后事件中:

cp $(TargetDir)EntityFramework.SqlServer.dll $(SolutionDir){your-main-bin-folder}
于 2016-06-13T15:38:56.597 回答
2

这只发生在我的负载/单元测试项目中。令人沮丧的是,我很高兴它出现在我已经运行了 2 年的项目中。一定是某种测试运行顺序破坏了事情。我想一旦那个fi被删除它就消失了。

我发现只需声明一个使用正确值的变量就可以解决问题……我什至从不调用该方法。只需定义它。奇怪但它有效。

    /// <summary>
    /// So that the test runner copies dlls not directly referenced by the integration project
    /// </summary>
    private void referenceLibs()
    {
        var useless = SqlProviderServices.Instance;
    }
于 2016-08-18T15:02:18.500 回答
2

我也有类似的问题

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

在此处输入图像描述

在此处输入图像描述

于 2017-10-12T15:06:25.657 回答
2

DBContext我在从单元测试项目中实例化对象时遇到了同样的问题。我检查了我的单元测试项目包,发现该EntityFramework包没有安装,我从 Nuget 安装了它并解决了问题(我认为这是 EF 错误)。

快乐编码

于 2018-01-06T11:51:45.000 回答
1

将 Entityframework.dll 和 Entityframework.sqlserver.dll 添加到参考项目中解决了这个问题。

于 2015-10-14T13:56:26.163 回答
1

我检查了单元测试项目中的调试输出窗口。EntityFramework.SqlServer.dll 未加载。将其添加到 bin 文件夹后,测试成功运行。

于 2015-11-18T20:42:05.897 回答
0

我只是有同样的错误信息。

我有一个单独的项目用于我的数据访问。在本地运行 Web 项目(它引用了数据项目)工作得很好。但是当我将 Web 项目部署到天蓝色的程序集时: EntityFramework.SqlServer 没有被复制。我刚刚添加了对 web 项目的引用并重新部署,现在它可以工作了。

希望这对其他人有帮助

于 2014-06-03T13:08:42.503 回答
0

我正在离线学习 Contoso 大学教程,并在尝试使用 EF 创建我的第一个控制器时遇到了同样的问题。我必须使用包管理器控制台从 nuget 缓存加载 EF 并创建一个连接到我的本地 SQL Server 实例的连接字符串,我的意思是我的 EF 的 webConfig 设置可能没有像你们一样设置,但我能够通过完全删除“entityFramework”中的“providers”部分来解决我的问题

罗伯特

于 2014-09-11T10:14:48.287 回答
0

有一个简单的解决方法。打开项目中的引用,右键单击“System.Data”-> 属性。将“复制本地”更改为“真”。

问题应该得到解决。

于 2014-11-27T19:16:58.903 回答
0

就我而言,当我之前安装了 SQL Server Express 2012 (x64) 时,我通过安装 SQL Server 2012 Developer Edition 解决了这个问题。似乎这为我提供了缺少的依赖项。

于 2015-06-04T10:41:59.630 回答
0

通过 nuget 从项目中删除实体框架,然后将其重新添加。

于 2016-01-28T05:30:49.173 回答
0

就我而言dll,虽然我添加了对它的引用,但没有复制它。这是因为EntityFramework.SqlServer.dll没有复制到您的项目中。添加该dll,它有望工作。您可以从添加数据模型的项目中找到它。

于 2016-03-21T15:34:15.803 回答
0

除了此处所有有用的建议外,如果您使用的是 EF 6.1.3,请确保您的项目的 .net 版本为 4.5 或更高版本。

于 2016-04-15T18:29:15.113 回答
0

我的问题是,为了捕获另一个异常,我启用了公共语言运行时 (CLR) 异常。我忘了禁用它。

我在异常设置中禁用了它。它忽略了这个异常并继续运行并自动为我(在我的情况下)创建一个数据库。

于 2016-07-12T11:46:15.920 回答
0

确保 EntityFramework.dll、EntityFramework.SqlServer.dll 和您的提供程序的 dll(对于 SQL Server Compact,将为 EntityFramework.SqlServerCompact.dll)位于已部署的应用程序文件夹中。这对于已部署的应用程序尤其重要。

于 2016-09-20T03:50:20.267 回答
0

我在我的 CI 构建服务器(运行 Bamboo)上遇到了完全相同的问题,它没有安装任何 Visual Studio IDE。

在不对构建/测试过程进行任何代码更改(我认为这不是好的解决方案)的情况下,最好的方法是将其复制EntityFramework.SqlServer.dll并粘贴到C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE. (你的 mstest 运行的地方)

问题解决了!

于 2017-11-21T09:55:09.153 回答
0

单击参考>检查实体框架参考是否存在

如果不可用添加它

点击

添加参考 > 添加实体框架 1)EntityFrameWork 2)EntityFrameWork.SqlServer

于 2018-11-01T17:05:41.923 回答