c# - 實體框架提供程序類型無法加載?




entity-framework mstest (20)

我試圖在我的機器上安裝的TeamCity上運行我的測試。

System.InvalidOperationException

System.Data.SqlClient ”ADO.NET提供程序的實體框架提供程序類型“ System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServerVersion=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'無法加載。 確保提供者程序集對正在運行的應用程序可用。

請參閱http://go.microsoft.com/fwlink/?LinkId=260882以獲取更多信息。

在我的任何項目中都沒有提及System.Data.Entity ,就像在codeplex上提出的升級到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

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://.com/a/22315164/1141360.
    private static SqlProviderServices instance = SqlProviderServices.Instance;
}

只需引用或瀏覽EF dll - EntityFramework.SqlServer.dll


在我的情況下,當我以前安裝SQL Server Express 2012(x64)時,我通過安裝SQL Server 2012 Developer Edition來解決該問題。 似乎給我提供了缺失的依賴關係。


在我的情況下,雖然我添加了對它的引用,但並未復制dll 。 這是因為EntityFramework.SqlServer.dll未復製到您的項目中。 添加該DLL,它會希望工作。你可以從你添加datamodel的項目中找到它。


我不想在我的應用程序項目中引用EF(或者手動複製任何東西),所以我將其添加到我的EF項目的構建後事件中:

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

我也有類似的問題

我的問題通過執行以下操作來解決:


我只是有同樣的錯誤信息。

我有一個單獨的項目用於我的數據訪問。 運行Web項目(引用數據項目)在本地工作得很好。 但是當我將web項目部署到天藍色的程序集時:EntityFramework.SqlServer未被複製。 我只是添加了對Web項目的引用並重新部署,現在它可以工作。

希望這有助於他人


我在我的CI構建服務器(運行Bamboo)上遇到了完全相同的問題,它不安裝任何Visual Studio IDE。

如果不對構建/測試過程進行任何代碼更改(我認為這不是好的解決方案),最好的方法是複制EntityFramework.SqlServer.dll並將其粘貼到C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE 。 (你的mstest運行的地方)

問題解決了!


我在離線工作的Contoso大學教程,並嘗試使用EF創建我的第一個控制器時遇到同樣的問題。 我不得不使用包管理器控制台從nuget緩存中加載EF,並創建一個連接字符串到我的本地SQL Server實例,這裡我的要點是我的EF的webConfig設置可能沒有設置,因為你都在那裡,但我能通過完全刪除“entityFramework”中的“providers”部分來解決我的問題

羅伯特


我已經通過手動將EntityFramework.SqlServer.dll文件複製到主應用程序的bin folder來解決此問題。


我有問題,因為我不添加對EntityFramework.sqlServer.dll的引用。 當我開發程序時,它會起作用。 但是當我發布應用程序並安裝它時,它會引發錯誤。

我只是再次添加引用和構建和發布。


我檢查了單元測試項目中的調試輸出窗口。 EntityFramework.SqlServer.dll未加載。 將它添加到bin文件夾後,測試成功運行。


我的問題是,為了捕獲另一個異常,我啟用了公共語言運行庫(CLR)異常。 我忘了禁用它。

我在我的例外設置中禁用了它。 它忽略了這個異常,並繼續運行並為我自動創建一個數據庫(在我的情況下)。


我的解決方案是通過nuget manager從項目中移除實體框架並將其添加回來。


我終於解決了。 事實證明,我在存儲庫類中錯誤地實現了IDIsposable。 我修正了這一點。 錯誤的實現導致了一個異常,因為我沒有正確地處理資源。 這導致VS不運行測試並且測試執行引擎崩潰。

我在這裡向微軟提交了這個報告(這是在我得到正確的解決方案之前)。 connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details

無論如何,builds現在在teamcity上運行良好。 儘管如此,我仍然很好奇為什麼VS Test執行引擎沒有一種優雅的方式告訴我發生的事情不是Team City。

我通過手動調試測試發現了根本原因(我只在這麼多天后才意識到這個修復花了5秒鐘)。

希望這會幫助遇到這種問題的人。


我通過在我的DBContext類的頂部添加一個sta sta來解決這個問題,如下所示:

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

有一個簡單的修復。 打開項目中的引用,右鍵單擊“System.Data” - >屬性。 將“複製本地”更改為“真”。

問題應該修復。


當我檢查問題時,我注意到輸出文件夾中缺少以下dll。 如果應用程序處於調試模式,簡單的解決方案是將具有app.config的Entityframework.dll和Entityframework.sqlserver.dll複製到輸出文件夾。 同時改變,始終複製app.config的build選項參數“Copy to output folder”。 這將解決您的問題。


這只發生在我的負載/單元測試項目中。 令人沮喪的是,我已經在一個我已經跑了兩年的項目中出現了。 一定是一些測試運行的順序,這會破壞事情。 我想,一旦這個fi被刪除,它就消失了。

我發現只要聲明一個使用正確值的變量就可以解決問題......我甚至從來沒有調用過這個方法。 只需定義它。 奇怪,但它的作品。

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

通過nuget從項目中刪除實體框架,然後重新添加。





entity-framework-6