私は現在私のマシンにインストールされているTeamCityで私のテストを実行しようとしています。
System.InvalidOperationException
:'
System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer
' ADO.NETプロバイダーのEntity Frameworkプロバイダータイプ 'Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
、System.Data.SqlClient
'をロードできませんでした。プロバイダアセンブリが実行中のアプリケーションで利用可能であることを確認してください。詳細については、 http://go.Microsoft.com/fwlink/?LinkId=260882 を参照してください。
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>
私はチームシティで以下のスタックトレースを得ます。
[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を介してEF 6をインストールしました。 EntityFramework.SqlServerが別の実行可能ファイルに対して見つかりませんでした。私は単にそのプロジェクトにnugetパッケージを追加しました。
私のテストプロジェクトでも同じ問題がありました。NuGet経由で最新のEF6ビットをインストールし、EF関連のものを呼び出すたびに、次のようになりました。
'System.Data.SqlClient' ADO.NETプロバイダーのEntity Frameworkプロバイダータイプ '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を使用しないでコンパイラがテストに失敗すると、「不要な」アセンブリはすべて削除されます。
とにかく:私のマシン上で動作します。)
注: テストプロジェクトにメソッドを追加する代わりに、Model/entityプロジェクトからSqlProviderServicesへの静的参照を確実にすることができます 。
NugetはEntityFramework.SqlServer.dllを参照するようにEF6プロジェクトを構成します。これはビルド中にEF6プロジェクトの出力フォルダーにデプロイされますが、EF6プロジェクトを参照するプロジェクトの出力フォルダーにはデプロイされません。これは、Visual Studioがアセンブリ内でdllを直接使用しているものが実際には何もないことを検出するのに十分に「スマート」であり、それを含まないためと考えられます。 EntityFramework.SqlServer.dllを使用するEF6プロジェクトにコードを追加することで、EF6プロジェクトを参照するプロジェクト(単体テスト、UIなど)の出力フォルダーにEntityFramework.SqlServer.dllを強制的に展開できます。次回の再生時にコードを失う危険性があるため、生成されたクラスにコードを入れないように注意してください。私はアセンブリに次のクラスを追加することにしました、それは問題を解決しました。
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 SqlProviderServices= System.Data.Entity.SqlServer.SqlProviderServices;
プロバイダにはコードベースの登録を使用しました。 link1link2
のような設定クラスを作成した
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)
{
...
}
}
私は私のアセンブリ初期化クラスの[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>
EntityFramework.sqlServer.dllへの参照を追加しないので、問題があります。私がプログラムを開発するとき、それは働きます。しかし、アプリを公開してインストールすると、エラーが発生します。
参照とBuild and Publishをもう一度追加します。
私は同様の問題を見て、この記事の方法を使用しています。( http://entityframework.codeplex.com/workitem/1590 )これで私の問題は解決しました。
この問題を回避するには、テストアセンブリ内の次の場所に次のような行を追加して、テストアセンブリでプロバイダアセンブリを直接参照するようにします。var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
私はついにこれを解決しました。結局のところ、私は自分のリポジトリクラスに誤ったIDIsposableの実装がありました。修正しました。私がリソースを適切に破棄していなかったので、誤った実装はstackoverflow例外を引き起こしました。これにより、VSがテストを実行せず、テスト実行エンジンがクラッシュしました。
私はここでマイクロソフトにそれを提出しました(これは私が正しい解決策を得る前にでした)。 connect.Microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details
とにかく、ビルドは今やチームシティで問題なく動作します。それにもかかわらず、私はどちらのVS Test実行エンジンがTeam City以外で何が起こっていたのかを私に伝える優雅な方法を持っていなかった理由にまだ興味がありません。
私は手動でテストをデバッグすることによって根本的な原因を発見しました(これは何日も経った後に気付いたのですが、修正には5秒かかりました)。
うまくいけば、これはそのような問題に出くわす誰かを助けるでしょう。
私は手動でEntityFramework.SqlServer.dll
ファイルをメインアプリケーションのbin folder
にコピーすることでこれを解決しました。
EF dll - EntityFramework.SqlServer.dllを参照または参照するだけです。
私は問題を調べたとき、私は次のdllがoutputフォルダにないことに気付きました。簡単な解決策は、アプリケーションがデバッグモードの場合、app.configファイルを含むEntityframework.dllとEntityframework.sqlserver.dllを出力フォルダにコピーすることです。同時に、app.configのビルドオプションパラメータ「出力フォルダにコピー」を常にコピーするように変更します。これで問題は解決します。
私は同じ問題を抱えていた私は何度も試してみましたが、それは解決しませんでしたが、私はパッケージEntityFramework.SqlServerCompactをインストールするときそれはNugetパッケージマネージャからこのパッケージをインストールする解決しました。
Install-Package EntityFramework.SqlServerCompact
これは私の負荷/単体テストプロジェクト内でのみ発生します。イライラして、私は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; }
私は自分のアプリケーションプロジェクトでEFを参照したくない(または手動で何かをコピーしたくない)ので、これをEFプロジェクトのビルド後イベントに追加しました。
cp $(TargetDir)EntityFramework.SqlServer.dll $(SolutionDir){your-main-bin-folder}
他のすべての提案された解決策を試しても私のプロジェクトがうまく動かなかった後、私はついに このページ にちょっとしたコメントを見つけました。
BINフォルダを削除すると私のためにそれをやった
そしてそれは私にとってもうまくいった。
単体テストプロジェクトで[デバッグ出力]ウィンドウをチェックしました。 EntityFramework.SqlServer.dllがロードされませんでした。 binフォルダーに追加した後、テストは正常に実行されました。
静的な "スタートアップ"ファイルを作成し、この[設定]を分けるために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);
}
}
</code>
参照プロジェクトにEntityframework.dllとEntityframework.sqlserver.dllを追加することで問題は解決しました。
私の場合は、以前にSQL Server Express 2012(x64)をインストールしたときにSQL Server 2012 Developer Editionをインストールすることで問題を解決しました。それは私に足りない依存関係を提供してくれたようです。
簡単な修正があります。プロジェクト内の参照を開き、[System.Data] - > [プロパティ]を右クリックします。 「Copy Local」を「True」に変更します。
問題は解決するはずです。
参照をクリック> EntityFramework参照が存在するかどうかを確認
使用できない場合は追加してください
クリック
参照の追加>エンティティフレームワークの追加1)EntityFrameWork 2)EntityFrameWork.SqlServer
EF 6.1.3を使用している場合は、ここにあるすべての有用な提案に加えて、プロジェクトの.netバージョンが4.5以上であることを確認してください。
私は単体テストプロジェクトからDBContext
オブジェクトをインスタンス化することで同じ問題を抱えていました。私は自分の単体テストプロジェクトパッケージをチェックし、EntityFramework
パッケージがインストールされていないことに気付きました。Nugetからそれをインストールし、問題を解決しました(EFバグだと思います)。
ハッピーコーディング
EntityFramework.dll、EntityFramework.SqlServer.dll、およびプロバイダのdll(SQL Server Compactの場合はEntityFramework.SqlServerCompact.dll)が展開されたアプリケーションフォルダにあることを確認してください。これはデプロイされたアプリケーションにとって特に重要です。
私の場合、dll
は参照を追加しましたがコピーされませんでした。これは、EntityFramework.SqlServer.dll
がプロジェクトにコピーされていないためです。そのdllを追加すればうまくいくでしょう。datamodelを追加したプロジェクトからそれを見つけることができます。
私はCIビルドサーバー(Bambooを実行している)でまったく同じ問題に遭遇しました。これにはVisual Studio IDEがインストールされていません。
ビルド/テストプロセスのためにコードを変更することなく(これは良い解決策だとは思わない)、最良の方法はEntityFramework.SqlServer.dll
をコピーしてC:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE
に貼り付けることです。 (mstestが動作している場所)
問題が解決しました!
私はちょうど同じエラーメッセージがありました。
データアクセス用に別のプロジェクトがあります。 Webプロジェクト(データプロジェクトを参照している)をローカルで実行しても問題なく動作しました。しかし、私がAzure the AssemblyにWebプロジェクトをデプロイしたとき、EntityFramework.SqlServerはコピーされませんでした。 Webプロジェクトへの参照を追加して再デプロイしたところ、動作します。
これが他の人に役立つことを願っています
nugetを使用してプロジェクトからエンティティフレームワークを削除してから、再度追加します。
私の場合の問題は、別の例外をキャッチするために共通言語ランタイム(CLR)例外を有効にしていたことです。そして私はそれを無効にするのを忘れていました。
例外設定で無効にしました。そしてそれはこの例外を見落として、そして自動的に(私の場合には)私のためにdbを実行して作成し続けました。
Contoso Universityチュートリアルオフラインで作業していて、EFを使用して最初のコントローラーを作成しようとしたときに同じ問題が発生しました。 Package Managerコンソールを使用して、nugetキャッシュからEFをロードし、SQL Serverのローカルインスタンスへの接続文字列を作成する必要がありました。 「entityFramework」内の「provider」セクションを完全に削除して私の問題を解決する
ロバート