关于c#:无法加载实体框架提供程序类型?

Entity Framework Provider type could not be loaded?

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

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..

我在我的任何项目中都没有提到System.Data.Entity,正如codeplex上建议升级到ef6的那样。

所以,我不知道为什么我会得到这个例外。当我从vs.

我确实尝试将copyloc设置为false,然后再次设置为true。但这似乎也行不通。

更新

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

1
2
3
4
5
6
7
8
9
10
<?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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[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
epository\Infrastructure\EFRepository.cs:line 22
   at IntegrationTests.CrudTest.Initialize() in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\IntegrationTests\CrudTest.cs:line 34


同样的问题,但我通过Nuget安装了EF6。另一个可执行文件缺少EntityFramework.sqlserver。我只是把Nuget包添加到那个项目中。


我在测试项目中遇到了同样的问题——我通过nuget安装了最新的ef6位,每当我调用与ef相关的东西时,我都会得到:

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.

我的解决方法:我把这个方法放在我的测试项目中:

1
2
3
4
5
6
7
8
9
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,而不是将该方法添加到测试项目中。


Nuget会将EF6项目配置为引用EntityFramework.sqlserver.dll。这将在生成期间部署到EF6项目的输出文件夹,但对于引用EF6项目的项目,它不会部署到输出文件夹。我认为这是因为Visual Studio足够"智能",可以检测到程序集中没有任何东西实际直接使用dll,因此不包括它。通过向使用entityframework.sqlserver.dll的EF6项目添加代码,可以强制将entityframework.sqlserver.dll部署到引用EF6项目(单元测试、UI等)的项目的输出文件夹中。小心不要将代码放在生成的类中,因为在下一次重新生成时可能会丢失代码。我选择将以下类添加到程序集,这解决了问题。

1
2
3
4
5
6
7
8
9
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管理器从项目中移除实体框架,并将其添加回。


我通过在dbContext类上添加using stament解决了这个问题,如下所示:

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


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

刚刚创建了配置类

1
2
3
4
5
6
7
8
class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        this.SetDatabaseInitializer(new DropCreateDatabaseAlways<MyDbContext>());
        this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}

关键点是this.setProviderServices(sqlsProviderServices.ProviderInVariantName,sqlsProviderServices.Instance);

用这种方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[DbConfigurationType(typeof(DbContextConfiguration))]
public class MyDbContext : DbContext
{
    public MyDbContext()
    {
        ...
    }

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ...
    }
}


我在程序集初始化类时用[deploymentem]对其进行了排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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中删除以下内容。工作。

1
2
3
4
5
6
7
8
9
10
  <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>


我有问题,因为我没有添加对entityframework.sqlserver.dll的引用。当我开发程序时,它是有效的。但当我发布并安装应用程序时,它会抛出错误。

我只是添加引用,然后重新构建和发布。

References


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

要解决此问题,可以通过在测试程序集中的任何位置添加类似这样的行,使测试程序集直接引用提供程序程序集:var uu=system.data.entity.sqlserver.sqlproviderservices.instance;


我终于解决了这个问题。结果,我在我的知识库类中有一个IDisposable的错误实现。我确定了。错误的实现导致了stackoverflow异常,因为我没有正确地处理资源。这导致vs不运行测试,测试执行引擎崩溃。

我在这里把它提交给微软(这是在我得到正确的解决方案之前)。connect.microsoft.com/VisualStudio/Feedback/Details/775868/vs-test-execution-crasks-in-vs-2012详细信息

不管怎样,现在TeamCity的构建运行良好。尽管如此,我仍然好奇为什么VS测试执行引擎都没有一种优雅的方式来告诉我发生了什么,而不是团队城市。

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

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


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


我也有同样的问题,我尝试了很多次,但没有解决,但当我安装包entityframework.sqlservercompact时,它解决了从nuget包管理器安装这个包。

1
Install-Package EntityFramework.SqlServerCompact

只需引用或浏览ef dll-entityframework.sqlserver.dll


当我检查问题时,我注意到输出文件夹中缺少以下dll。如果应用程序处于调试模式,简单的解决方案是将带有app.config的entityframework.dll和entityframework.sqlserver.dll复制到输出文件夹。同时,将app.config的build选项参数"copy to output folder"更改为"copy always"。这将解决你的问题。


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

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

在尝试了所有其他建议的解决方案,但没有使我的项目正常运行之后,我终于在本页找到了一些评论:

Deleting the BIN-Folder did it for me

这对我也很管用。


这只发生在我的负载/单元测试项目中。令人沮丧的是,我在一个我已经运行了两年的项目中突然发现了它。一定是测试运行的顺序破坏了一切。我想一旦FI被移除,它就消失了。

我发现只要声明一个使用正确值的变量就可以解决这个问题…我从来没有调用过这个方法。定义一下。很奇怪,但它起作用了。

1
2
3
4
5
6
7
    /// <summary>
    /// So that the test runner copies dlls not directly referenced by the integration project
    /// </summary>
    private void referenceLibs()
    {
        var useless = SqlProviderServices.Instance;
    }

将entityframework.dll和entityframework.sqlserver.dll添加到引用项目中解决了此问题。


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


我也有类似的问题

我的问题通过以下步骤解决:

enter image description here

enter image description here


我已经创建了一个静态的"启动"文件,并添加了代码来强制将dll复制到其中的bin文件夹中,以此来分隔这个"配置"。


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

ZZU1〔1〕


在我的例子中,我通过安装SQL Server 2012 Developer Edition(以前安装过SQL Server Express 2012(x64))来解决这个问题。这似乎为我提供了缺失的依赖。


单击"引用>检查EntityFramework引用是否存在"

如果不可用,添加它

点击

Add Reference > Add entity framework 1)EntityFrameWork
2)EntityFrameWork.SqlServer


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


除了这里所有有用的建议外,如果您使用的是EF6.1.3,请确保您的项目的.NET版本是4.5或更高。


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

应该解决问题。


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

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


我正在离线编写Contoso大学教程,在尝试使用EF创建第一个控制器时遇到了同样的问题。我不得不使用包管理器控制台从nuget缓存加载ef,并创建了一个到我的本地SQL Server实例的连接字符串,这里我的观点是,我的ef webconfig设置可能不会像你们一样设置,但我能够通过完全删除"entityframework"中的"providers"部分来解决我的问题。

罗伯特


确保entityframework.dll、entityframework.sql server.dll和提供程序的dll(对于SQL Server Compact,这将是entityframework.sqlserverCompact.dll)位于已部署的应用程序文件夹中。这对于部署的应用程序尤其重要。


我刚刚收到同样的错误信息。

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

希望这能帮助别人


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

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

问题解决了!


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

快乐编码


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