我正在尝试在当前安装在我的机器上的 TeamCity 上运行我的测试。
System.InvalidOperationException:“System.Data.SqlClient”ADO.NET 的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”无法加载提供程序。确保提供程序程序集可用于正在运行的应用程序。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882。
正如 codeplex 上建议的升级到 EF6 的那样,我在我的任何项目中都没有引用 System.Data.Entity
。
所以,我不确定为什么会出现这个异常。当我从 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
private volatile Type _dependency...
答案,它奏效了!只是为了让 EF 在 TeamCity 中工作,我必须添加一个像这样的单独的类,这很糟糕。
同样的问题,但我通过 Nuget 安装了 EF 6。另一个可执行文件缺少 EntityFramework.SqlServer。我只是将 nuget 包添加到该项目中。
我在我的测试项目中遇到了同样的问题 - 我通过 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 的情况下测试失败。
无论如何:在我的机器上工作;)
DbContext
类将解决 EF 6.1 中的问题。这样您就不需要在前端(WebApi 等)项目中包含实体框架 Nuget 包,并且可以将所有与 EF 相关的内容留在数据层中。
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;
}
我的解决方案是通过 nuget 管理器从项目中删除实体框架并将其重新添加。
PM> Update-Package -Reinstall "EntityFramework" -ProjectName "MyProj1"
我通过在我的 DBContext 类顶部添加一个 using 语句解决了这个问题,如下所示:
using SqlProviderServices= System.Data.Entity.SqlServer.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)
{
...
}
}
DbContextConfiguration
放在哪里(进入哪个项目)?谢谢
Get-Project MyWinformsProject | Install-Package EntityFramework
为我修复了它。我仍然想更好地理解原因。
DbConfiguration.Loaded += (sender, e) => e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
。
我在我的程序集初始化类中使用 [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());
}
}
}
派对迟到了,但投票率最高的答案对我来说似乎都是黑客行为。
我所做的只是从测试项目中的 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>
<provider ... SqlClient...>
。这在这里也有效。
我有问题,因为我没有添加对 EntityFramework.sqlServer.dll 的引用。当我开发程序时,它可以工作。但是当我发布应用程序并安装它时,它会抛出错误。
我只是添加参考并再次构建和发布。
https://i.stack.imgur.com/mzuTD.png
我通过手动将 EntityFramework.SqlServer.dll
文件复制到主应用程序的 bin folder
解决了这个问题。
我有同样的问题我尝试了很多次但它没有解决但是当我安装包 EntityFramework.SqlServerCompact 它解决了从 Nuget 包管理器安装这个包。
Install-Package EntityFramework.SqlServerCompact
我看到类似的问题,并使用这篇文章中的方法:(http://entityframework.codeplex.com/workitem/1590),它解决了我的问题。
要解决此问题,您可以通过在测试程序集的任何位置添加类似这样的行来使您的测试程序集直接引用提供程序程序集: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
我创建了一个静态“启动”文件并添加了代码以强制将 DLL 复制到其中的 bin 文件夹中,以此作为分隔此“配置”的一种方式。
[DbConfigurationType(typeof(DbContextConfiguration))] public static class Startup { }
public class DbContextConfiguration : DbConfiguration { public DbContextConfiguration() { // 这需要强制将 EntityFramework.SqlServer DLL 复制到 bin 文件夹 SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance); } }
EntityFramework.SqlServer.dll
的手动引用,并将此类添加到节点 <entityFramework codeConfigurationType="........">example</entityFramework>
中的配置文件中.
我终于解决了这个问题。事实证明,我的存储库类中有一个错误的 IDIsposable 实现。我修好了。错误的实现导致了 stackoverflow 异常,因为我没有正确处理资源。这导致 VS 无法运行测试,测试执行引擎崩溃。
我在这里向微软提交了它(这是在我得到正确的解决方案之前)。 connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details
无论如何,现在构建在 teamcity 上运行良好。虽然,我仍然很好奇为什么 VS 测试执行引擎都没有优雅的方式告诉我发生了什么,而不是 Team City。
我通过手动调试测试发现了根本原因(经过这么多天我才意识到,修复花了我 5 秒)。
希望这将帮助遇到此类问题的人。
当我检查问题时,我注意到输出文件夹中缺少以下 dll。如果应用程序处于调试模式,简单的解决方案是将 Entityframework.dll 和 Entityframework.sqlserver.dll 与 app.config 复制到输出文件夹。同时将app.config的构建选项参数“Copy to output folder”更改为始终复制。这将解决您的问题。
只需引用或浏览 EF dll - EntityFramework.SqlServer.dll
在尝试了所有其他建议的解决方案并且没有让我的项目运行之后,我终于在 this page 中找到了一点评论:
删除 BIN 文件夹为我做了
它也对我有用。
我不想在我的应用程序项目中引用 EF(或手动复制任何内容),因此我将其添加到我的 EF 项目的构建后事件中:
cp $(TargetDir)EntityFramework.SqlServer.dll $(SolutionDir){your-main-bin-folder}
这只发生在我的负载/单元测试项目中。令人沮丧的是,我很高兴它出现在我已经运行了 2 年的项目中。一定是某种测试运行顺序破坏了事情。我想一旦那个fi被删除它就消失了。
我发现只需声明一个使用正确值的变量就可以解决问题……我什至从不调用该方法。只需定义它。奇怪但它有效。
///
我也有类似的问题
通过执行以下操作解决了我的问题:
https://i.stack.imgur.com/E6g69.png
https://i.stack.imgur.com/sBZpB.png
我在从单元测试项目中实例化 DBContext
对象时遇到了同样的问题。我检查了我的单元测试项目包,发现没有安装 EntityFramework
包,我从 Nuget 安装了它并解决了问题(我认为这是 EF 错误)。
快乐编码
将 Entityframework.dll 和 Entityframework.sqlserver.dll 添加到参考项目中解决了这个问题。
我检查了单元测试项目中的调试输出窗口。 EntityFramework.SqlServer.dll 未加载。将其添加到 bin 文件夹后,测试成功运行。
我只是有同样的错误信息。
我有一个单独的项目用于我的数据访问。在本地运行 Web 项目(它引用了数据项目)工作得很好。但是当我将 Web 项目部署到天蓝色的程序集时: EntityFramework.SqlServer 没有被复制。我刚刚添加了对 web 项目的引用并重新部署,现在它可以工作了。
希望这对其他人有帮助
我正在离线学习 Contoso 大学教程,并在尝试使用 EF 创建我的第一个控制器时遇到了同样的问题。我必须使用包管理器控制台从 nuget 缓存加载 EF 并创建一个连接到我的本地 SQL Server 实例的连接字符串,我的意思是我的 EF 的 webConfig 设置可能没有像你们一样设置,但我能够通过完全删除“entityFramework”中的“providers”部分来解决我的问题
罗伯特
有一个简单的解决方法。打开项目中的引用,右键单击“System.Data”-> 属性。将“复制本地”更改为“真”。
问题应该得到解决。
就我而言,当我之前安装了 SQL Server Express 2012 (x64) 时,我通过安装 SQL Server 2012 Developer Edition 解决了这个问题。似乎这为我提供了缺少的依赖项。
通过 nuget 从项目中删除实体框架,然后将其重新添加。
在我的情况下,dll
没有被复制,尽管我添加了对它的引用。这是因为EntityFramework.SqlServer.dll
没有复制到您的项目中。添加该dll,它有望工作。您可以从添加数据模型的项目中找到它。
除了此处所有有用的建议外,如果您使用的是 EF 6.1.3,请确保您的项目的 .net 版本为 4.5 或更高版本。
x.ToString()
,否则会删除 Release 中的typeof
。