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

系统。InvalidOperationException: 实体框架提供程序类型 “System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework。SqlServer,版本=6.0.0.0,区域性=中性, System.Data.SqlClient的PublicKeyToken=b77a5c561934e089 ADO。NET提供程序无法加载。确保提供程序集 对正在运行的应用程序可用。 详见http://go.microsoft.com/fwlink/?LinkId=260882 信息. .

我在codeplex上升级到EF6的任何项目中都没有引用System.Data.Entity。

我不确定为什么会得到这个异常。 当我从VS运行测试时,我没有得到任何这样的异常。

我尝试设置CopyLocal为假,然后再次为真..但这似乎也不管用。

更新

我的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中得到了以下stacktrace。

[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

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

我在微软这里提交了它(这是在我得到正确的解决方案之前)。 connect.microsoft.com/visualstudio/feedback/details/775868/vs -测试-执行-崩溃- vs - 2012 #的细节

不管怎样,构建现在在teamcity上运行良好。尽管如此,我还是很好奇为什么没有VS Test执行引擎能够优雅地告诉我Team City发生了什么。

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

希望这篇文章能对遇到此类问题的人有所帮助。


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


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

实体框架提供程序类型 “System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework。用于System.Data. SqlServer。SqlClient ADO。网 无法加载提供程序。确保提供程序集是 对正在运行的应用程序可用。看到 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 stuff测试失败。

不管怎样:在我的机器上工作;)

注意:与其将方法添加到测试项目中,不如确保从模型/实体项目中静态引用SqlProviderServices。


我对提供者使用了基于代码的注册。 link1 link2

刚刚创建了配置类

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)
    {
        ...
    }
}

Nuget will configure your EF6 project to reference EntityFramework.SqlServer.dll. This deploys to the output folder for your EF6 project during build, but it will not deploy to the output folder for projects referencing your EF6 project. I believe this is because Visual Studio is "smart" enough to detect that nothing in your assembly is actually using the dll directly and so does not include it. You can force EntityFramework.SqlServer.dll to be deployed to the output folder of projects referencing your EF6 project (unit tests, UI's etc.) by adding code to your EF6 project that uses EntityFramework.SqlServer.dll. Be careful not to put the code in a generated class as you risk losing it on next regen. I chose to add the following class to the assembly, which fixed the problem.

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

我只是收到了同样的错误信息。

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

希望这能帮助到其他人


我看到类似的问题,使用这个帖子中的方法:(http://entityframework.codeplex.com/workitem/1590),解决了我的问题。

为了解决这个问题,你可以让你的测试程序集直接引用提供者程序集,在测试程序集的任何地方添加一些像这样的行: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;


我离线制作Contoso University教程,在尝试使用EF创建我的第一个控制器时遇到了同样的问题。 我不得不使用包管理器控制台从nuget缓存加载EF,并创建了一个连接字符串到我的SQL Server的本地实例,我在这里的重点是我的webConfig设置EF可能不会设置为你们所有人,但我能够通过完全删除“entityFramework”内的“提供者”部分来解决我的问题

罗伯特。


我在程序集初始化类上使用[deploymenttem]整理了它

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());
        }
    }
}

有一个简单的解决办法。打开项目中的引用,右键单击“System”。Data" ->属性。将“Copy Local”改为“True”。

问题应该得到解决。


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


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


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

我只是再次添加引用和构建并发布。


在我的情况下,我通过安装SQL Server 2012开发版解决了这个问题,而我之前已经安装了SQL Server Express 2012 (x64)。这似乎为我提供了缺失的依赖关系。


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


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


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

using SqlProviderServices= System.Data.Entity.SqlServer.SqlProviderServices;

通过nuget将实体框架从项目中移除,然后再将其添加回来。


在我的情况下,dll没有被复制,尽管我添加了一个引用。这是因为EntityFramework.SqlServer.dllis没有复制到你的项目中。添加该dll,它将有望工作。您可以从添加数据模型的项目中找到这一点。


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


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


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


我不想在我的应用程序项目中引用EF(或手动复制任何东西),所以我将此添加到我的EF项目的Post-build事件:

cp $(TargetDir)EntityFramework.SqlServer.dll $(SolutionDir){your-main-bin-folder}

派对来晚了,但投票最多的答案对我来说都像是黑客。

我所做的只是从测试项目的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>

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

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


这只发生在我的负载/单元测试项目中。令人沮丧的是,我在一个已经运行了2年的项目中突然出现了这种情况。一定是某些测试运行的顺序把事情搞砸了。我猜一旦fi被移除,它就消失了。

我发现,简单地声明一个变量,使用正确的值修复问题…我从来没有调用过这个方法。定义一下。很奇怪,但很有效。

> / / / <总结 ///测试运行程序复制不被集成项目直接引用的dll > / / / < /总结 private void referenceLibs() { var useless = SqlProviderServices.Instance; }


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


我也遇到过类似的问题

我的问题是通过以下方法解决的:


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

不需要对构建/测试过程进行任何代码更改(我不认为这是一个好的解决方案),最好的方法是复制EntityFramework.SqlServer.dll并将其粘贴到C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE。(你在哪里奔跑)

问题解决了!


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

快乐的编码


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

Install-Package EntityFramework.SqlServerCompact

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

删除bin文件夹帮我解决了这个问题

这对我也很有效。


我已经创建了一个静态的“启动”文件,并添加了代码来强制DLL被复制到其中的bin文件夹中,作为分离这个“配置”的一种方式。

[DbConfigurationType typeof (DbContextConfiguration))) 公共静态类 { }

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


点击参考>检查EntityFramework参考是否存在

如果没有,请添加

点击

添加实体框架1)实体框架 2) EntityFrameWork。SqlServer