Próbuję uruchomić testy w TeamCity, który jest obecnie zainstalowany na moim komputerze.
System.InvalidOperationException
:Entity Framework typ provider „ na” 'dostawcy ADO.NET nie może być załadowany. Upewnij się, że zespół dostawcy jest dostępny dla uruchomionej aplikacji.
System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer
Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
System.Data.SqlClient
Zobacz http://go.microsoft.com/fwlink/?LinkId=260882 aby uzyskać więcej informacji ..
Nie mam odniesienia do System.Data.Entity
żadnego z moich projektów, jak sugerowano w codeplex do aktualizacji do EF6.
Nie jestem więc pewien, dlaczego otrzymuję ten wyjątek. Nie dostaję takiego wyjątku, gdy uruchamiam testy z VS.
Próbowałem ustawić wartość CopyLocal na false, a następnie ponownie na true. Ale to też nie działa.
Aktualizacja
Mój app.config ma następujące cechy. Czy to powoduje pewne zachowania, których nie rozumiem?
<?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>
Otrzymuję następujący stacktrace w 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
źródło
private volatile Type _dependency...
odpowiedź i zadziałała! Śmierdzi tylko, że muszę dodać osobną klasę, aby EF działał w TeamCity.Odpowiedzi:
Ten sam problem, ale zainstalowałem EF 6 przez Nuget. Brak EntityFramework.SqlServer dla innego pliku wykonywalnego. Po prostu dodałem pakiet nuget do tego projektu.
źródło
x.ToString()
lub spowoduje to usunięcietypeof
w wersji.Miałem ten sam problem w moich projektach testowych - instalowałem najnowsze bity EF6 za pośrednictwem NuGet i za każdym razem, gdy wywołuję coś związanego z EF, otrzymałem:
Moje obejście: umieściłem tę metodę w moim projekcie testowym:
Ta metoda nigdy nie została wywołana, ale myślę, że kompilator usunie wszystkie „niepotrzebne” zespoły i bez użycia elementu EntityFramework.SqlServer test nie powiedzie się.
W każdym razie: Działa na moim komputerze;)
Uwaga: Zamiast dodawać metodę testowania projektu, można zapewnić statyczne odniesienie do SqlProviderServices z projektu modelu / encji .
źródło
DbContext
klasy rozwiąże problem w EF 6.1. W ten sposób nie musisz dołączać pakietu Entity Framework Nuget do projektu frontonu (WebApi itp.) I możesz pozostawić wszystko, co związane z EF w twojej warstwie danych.Nuget skonfiguruje projekt EF6 tak, aby odwoływał się do EntityFramework.SqlServer.dll. To wdraża się do folderu wyjściowego dla projektu EF6 podczas kompilacji, ale nie zostanie wdrożone do folderu wyjściowego dla projektów odwołujących się do projektu EF6. Wierzę, że dzieje się tak, ponieważ program Visual Studio jest wystarczająco „inteligentny”, aby wykryć, że nic w zestawie nie korzysta bezpośrednio z biblioteki dll i dlatego go nie zawiera. Możesz zmusić EntityFramework.SqlServer.dll do wdrożenia w folderze wyjściowym projektów odnoszących się do twojego projektu EF6 (testy jednostkowe, interfejsy użytkownika itp.), Dodając kod do projektu EF6, który używa EntityFramework.SqlServer.dll. Uważaj, aby nie umieścić kodu w wygenerowanej klasie, ponieważ ryzykujesz utratę go przy następnej regeneracji. Zdecydowałem się dodać następującą klasę do zestawu, co naprawiło problem.
źródło
Moim rozwiązaniem było usunięcie frameworku encji z projektu za pomocą menedżera nugetów i dodanie go z powrotem.
źródło
PM> Update-Package -Reinstall "EntityFramework" -ProjectName "MyProj1"
Rozwiązałem ten problem, dodając stament używający na mojej klasie DBContext, tak jak poniżej:
źródło
Użyłem rejestracji opartej na Kodeksie dla dostawcy. link1 link2
Właśnie utworzyłem klasę konfiguracji jak
Kluczowym punktem jest this.SetProviderServices (SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
i użyłem go w taki sposób
źródło
DbContextConfiguration
? DziękiGet-Project MyWinformsProject | Install-Package EntityFramework
to naprawiło to dla mnie. Nadal chciałbym lepiej zrozumieć przyczynę.DbConfiguration.Loaded += (sender, e) => e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
.Rozwiązałem to za pomocą [DeploymentItem] na mojej klasie inicjalizującej zestaw
źródło
Późno na imprezę, ale wszystkie najczęściej głosowane odpowiedzi wydawały mi się hackami.
Wszystko, co zrobiłem, to usunięcie z mojego app.config w projekcie testowym. Pracował
źródło
Mam problem, ponieważ nie dodam odwołania do EntityFramework.sqlServer.dll. Kiedy opracowuję program, działa. Ale kiedy publikuję i instaluję aplikację, generuje błąd.
Po prostu dodaję referencje oraz ponownie buduję i publikuję.
źródło
Rozwiązałem to, ręcznie kopiując
EntityFramework.SqlServer.dll
plik dobin folder
głównej aplikacji.źródło
W końcu to rozwiązałem. Okazuje się, że miałem błędną implementację IDIsposable w mojej klasie repozytorium. Naprawiłem to. Błędna implementacja spowodowała wyjątek przepełnienia stosu, ponieważ nie pozbywałem się właściwie zasobów. Spowodowało to, że VS nie uruchomił testów, a silnik wykonujący test się zawiesił.
Złożyłem go tutaj w Microsoft (to było zanim otrzymałem właściwe rozwiązanie). connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details
W każdym razie kompilacje działają teraz poprawnie w teamcity. Mimo to wciąż jestem ciekawy, dlaczego żaden silnik wykonawczy VS Test nie miał tak wdzięcznego sposobu na powiedzenie mi, co się nie dzieje w Team City.
Odkryłem główną przyczynę, ręcznie debugując test (co zdałem sobie sprawę dopiero po tylu dniach, naprawa zajęła mi 5 sekund).
Mamy nadzieję, że pomoże to komuś, kto napotka takie problemy.
źródło
Widzę podobny problem i przy użyciu metody z tego postu: ( http://entityframework.codeplex.com/workitem/1590 ), co rozwiązuje mój problem.
Aby obejść ten problem, możesz sprawić, aby zestaw testowy bezpośrednio odwoływał się do zestawu dostawcy, dodając taką linię w dowolnym miejscu w zestawie testowym: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
źródło
Podczas sprawdzania problemu zauważyłem, że w folderze wyjściowym brakuje następującej biblioteki DLL. Prostym rozwiązaniem jest skopiowanie Entityframework.dll i Entityframework.sqlserver.dll z app.config do folderu wyjściowego, jeśli aplikacja jest w trybie debugowania. Jednocześnie zmień parametr opcji kompilacji „Kopiuj do folderu wyjściowego” app.config, aby zawsze kopiować. To rozwiąże twój problem.
źródło
Wystarczy odwołać się do przeglądarki dll lub przeglądać plik EF - EntityFramework.SqlServer.dll
źródło
Miałem ten sam problem, który próbowałem wiele razy, ale nie udało się go rozwiązać, ale po zainstalowaniu pakietu EntityFramework.SqlServerCompact rozwiązałem instalację tego pakietu z Menedżera pakietów Nuget.
źródło
Utworzyłem statyczny plik „startowy” i dodałem kod, aby zmusić bibliotekę DLL do skopiowania do folderu bin w celu oddzielenia tej „konfiguracji”.
[DbConfigurationType(typeof(DbContextConfiguration))] public static class Startup { }
źródło
Nie chciałem mieć odniesienia do EF w moim projekcie aplikacji (ani ręcznie kopiować niczego), więc dodałem to do wydarzeń po kompilacji mojego projektu EF:
źródło
Dzieje się tak tylko w moich projektach testowania obciążenia / jednostki. Frustrujące było to, że pojawił się w projekcie, który prowadzę od 2 lat. Musiała być jakaś kolejność uruchamiania testów, która psuje rzeczy. Myślę, że kiedy to fi zostanie usunięte, zniknęło.
Odkryłem, że zwykłe zadeklarowanie zmiennej, która używa poprawnej wartości, rozwiązuje problem ... Nigdy nawet nie wywołuję tej metody. Po prostu to zdefiniuj. Dziwne, ale działa.
źródło
Po wypróbowaniu wszystkich innych sugerowanych rozwiązań i nie uruchomieniu mojego projektu, w końcu znalazłem mały komentarz na tej stronie :
I to też działało dla mnie.
źródło
Dodanie Entityframework.dll i Entityframework.sqlserver.dll do projektu referencyjnego rozwiązało problem.
źródło
Sprawdziłem okno Wyjście debugowania w projekcie testu jednostkowego. EntityFramework.SqlServer.dll nie został załadowany. Po dodaniu go do folderu bin testy zostały pomyślnie uruchomione.
źródło
Miałem również podobny problem
Mój problem został rozwiązany przez wykonanie następujących czynności:
źródło
Miałem ten sam problem z
DBContext
obiektem tworzenia instancji z projektu testu jednostkowego. Sprawdziłem pakiety projektów testów jednostkowych i doszedłem do tegoEntityFramework
pakiet nie został zainstalowany, zainstalowałem go z Nuget i rozwiązałem problem (myślę, że to błąd EF).szczęśliwego kodowania
źródło
Właśnie otrzymałem ten sam komunikat o błędzie.
Mam osobny projekt dostępu do danych. Lokalne uruchomienie projektu WWW (który odwoływał się do projektu danych) działało lokalnie dobrze. Ale kiedy wdrożyłem projekt WWW, aby lazurować zestaw: EntityFramework.SqlServer nie został skopiowany. Właśnie dodałem odniesienie do projektu internetowego i ponownie wdrożyłem, teraz działa.
mam nadzieję, że to pomaga innym
źródło
Pracowałem w trybie offline na samouczku Uniwersytetu Contoso i napotkałem ten sam problem podczas próby utworzenia mojego pierwszego kontrolera za pomocą EF. Musiałem użyć konsoli Menedżera pakietów, aby załadować EF z pamięci podręcznej nuget i utworzyłem ciąg połączenia z moją lokalną instancją SQL Server. Chodzi mi o to, że moje ustawienia webConfig dla EF mogą nie być ustawione, ponieważ wszyscy tam byli, ale byłem w stanie aby rozwiązać mój problem, całkowicie usuwając sekcję „dostawcy” w ramach „entityFramework”
Robert
źródło
Jest łatwa poprawka. otwórz odniesienia w swoim projekcie, kliknij prawym przyciskiem myszy „System.Data” -> właściwości. Zmień „Kopiuj lokalnie” na „Prawda”.
Problem powinien zostać rozwiązany.
źródło
W moim przypadku problem rozwiązałem, instalując program SQL Server 2012 Developer Edition, gdy wcześniej zainstalowałem program SQL Server Express 2012 (x64). Wydaje się, że dostarczyło mi brakującą zależność.
źródło
usuń strukturę encji z projektu za pomocą nugetu, a następnie dodaj ją ponownie.
źródło
W moim przypadku
dll
nie został skopiowany, chociaż dodałem do niego odniesienie. Jest tak, ponieważEntityFramework.SqlServer.dll
nie jest kopiowane do twojego projektu. Dodaj tę bibliotekę dll i mam nadzieję, że zadziała. Możesz ją znaleźć w projekcie, w którym dodałeś model danych.źródło
Oprócz wszystkich użytecznych sugestii tutaj, jeśli używasz EF 6.1.3, upewnij się, że wersja .net twojego projektu to 4.5 lub więcej.
źródło