Nie można załadować typu Entity Framework Provider?

420

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.SqlServerVersion=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
ashutosh raina
źródło
1
Czy EntityFramework.SqlServer.dll jest wdrażany wraz z EntityFramework.dll? W EF6 SqlServer i SqlServerCE dostawcy nie są w tym samym zestawie co silnik EF, jak to miało miejsce w poprzednich wersjach. Nie należy dodawać odwołania do System.Data.Entity.dll. Model dostawcy w EF6 został zmieniony w porównaniu do EF5, a dostawca EF5 po prostu nie będzie działać. Ponadto możesz napotkać kilka trudnych problemów (takich jak typy geoprzestrzenne EF5 traktowane jako typy jednostek w EF6)
Pawel
Tak, dwukrotnie sprawdziłem, czy nie ma odwołania do System.Data.Entity i czy istnieją odniesienia do EntityFramework.dll i EntityFramework.SqlServer.dll. Ponownie kompilacje i testy projetc działają w VS. Błąd pojawia się dopiero, gdy przeprowadzam testy na TeamCity.
ashutosh raina
To jest poprawna konfiguracja. Nie korzystałem z TeamCity, ale wydaje mi się, że po wdrożeniu aplikacji do uruchomienia testów z TeamCity brakuje EntityFramework.SqlServer.dll i stąd wyjątek.
Paweł
1
zobacz odpowiedź z tego postu: stackoverflow.com/questions/21175713/ ... Dodałem private volatile Type _dependency...odpowiedź i zadziałała! Śmierdzi tylko, że muszę dodać osobną klasę, aby EF działał w TeamCity.
a11smiles
2
Odinstalowałem EntityFramework z pakietów
nuget

Odpowiedzi:

426

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.

Zapacila
źródło
108
Też to zauważyłem. Jeśli utworzysz bibliotekę korzystającą z EF, VS umieści EF.dll i EF.SqlServer.dll w tym folderze kompilacji. Ale jeśli masz teraz inny program korzystający z biblioteki, tylko EF.dll zostanie umieszczony w tym folderze kompilacji. Brak pliku EF.SqlServer.dll. Jeśli dodasz go ręcznie do folderu kompilacji, program będzie działał. Nie jest to dobre rozwiązanie samo w sobie, ale pokazuje, że przyczyną problemu jest brak pliku EF.SQLServer.dll.
Eric,
44
Dodałem var x = typeof (System.Data.Entity.SqlServer.SqlProviderServices); Potem zadziałała moja aplikacja
Brian,
33
Zawsze martwię się, gdy wpisuję kod, który absolutnie nic nie robi i nagle mój projekt się uruchamia. O_o
Jordan
10
Ponadto, ze względu na optymalizację kompilatora, możesz chcieć to zrobić x.ToString()lub spowoduje to usunięcie typeofw wersji.
Jordan
15
Uważam za denerwujące, że EF 6.1 wymaga teraz EF zainstalowanego na moim DLL / Projekcie ASPX, podczas gdy EF 5.0 potrzebował go tylko na moim DLL / Projekcie warstwy danych.
PeterX
274

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:

Nie można załadować dostawcy Entity Framework typu „System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer” dla dostawcy ADO.NET „System.Data.SqlClient”. Upewnij się, że zespół dostawcy jest dostępny dla uruchomionej aplikacji. Aby uzyskać więcej informacji, zobacz http://go.microsoft.com/fwlink/?LinkId=260882

Moje obejście: umieściłem tę metodę w moim projekcie testowym:

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;
}

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 .

Robert Muehsig
źródło
24
Skończyło się tak samo. Chciałbym porozmawiać z tą osobą, która uzależniła ten zestaw od otwarcia połączenia z db. W swoim alternatywnym wszechświecie wszystkie nasze projekty frontendów, które mają plik konfiguracyjny z ciągiem połączenia, powinny odwoływać się do EntityFramework tylko po to, aby uzyskać ten dll do otwarcia połączenia. W jaki sposób ma to sens, którego nie rozumiem.
juhan_h
3
To włamanie, ale jest to najlepsze / najłatwiejsze rozwiązanie, jakie znalazłem dla scenariusza, w którym nie masz pakietu wdrożeniowego utworzonego dla twojego projektu.
Kon
3
Dla wszystkich korzystających z innych sugestii, takich jak „var x = typeof (SqlProviderServices);”. Tylko to rozwiązanie dostarczone przez Roberta działa na rozwój i budowę maszyn !!!
Alexander Schmidt
3
Dzięki Robertowi, zespół EF jest niedorzeczny, ale i tak to działa.
Hitesh
7
Żeby było jasne: dodanie powyższego kodu do DbContextklasy 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.
Nick
106

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.

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;
}
Timothy Schoonover
źródło
1
To rozwiązało problem dla mnie w odniesieniu do MSTest. Podoba mi się ta metoda, ponieważ nie wymaga ode mnie robienia czegokolwiek z dziedziczeniem klas na moich klasach testowych. Wystarczy dołączyć klasę gdzieś w zestawie testowym i MAGIC. Dzięki!
kbrimington
Właśnie dlatego nie kopiuje pliku sqlserver.dll do danych wyjściowych projektów referencyjnych. Dzieje się tak, gdy pomiędzy uruchomieniem aplikacji a zestawem kontekstowym jest jeszcze jedna warstwa. Dzięki temu rozwiązałem mój problem.
Bharat
2
Dla tych, którzy nie chcą spędzać 4 sekund na wyszukiwaniu: przy użyciu System.Data.Entity.SqlServer;
TTT,
Używamy wspólnej klasy bazowej do testów jednostkowych, wszystkie testy jednostkowe dziedziczą z tej klasy. Dodanie tej metody do tej jednej klasy oznacza, że ​​wszystkie projekty z klasą testu jednostkowego dziedziczącą z klasy podstawowej działają poprawnie.
MaxJ
3
Mały punkt, ale prawdopodobnie najlepiej jest dodać komentarz do tej klasy, aby wyjaśnić, dlaczego jest to konieczne.
John Darvill,
43

Moim rozwiązaniem było usunięcie frameworku encji z projektu za pomocą menedżera nugetów i dodanie go z powrotem.

Kevbo
źródło
9
PM> Update-Package -Reinstall "EntityFramework" -ProjectName "MyProj1"
VahidN
To zadziałało dla mnie i myślę, że może to być optymalne rozwiązanie
ccoutinho,
Proste, czyste rozwiązanie, które działa. Powinno być znacznie wyżej na liście
mode777
29

Rozwiązałem ten problem, dodając stament używający na mojej klasie DBContext, tak jak poniżej:

using SqlProviderServices= System.Data.Entity.SqlServer.SqlProviderServices;
mmttato
źródło
1
To najczystsze rozwiązanie tego problemu. Dziękuję Ci.
Alexandru Dicu,
To rozwiązanie działa i wygląda na czyste. Pytanie: czy nie stracimy identyfikatora wiersza klasa DBContext jest odświeżana? tj. używając generowania klasy edmx?
NoloMokgosi
Nie mogę uwierzyć, że było to konieczne i jakoś nie zostało poprawione przez Microsoft - ale to zadziałało dla mnie. Dzięki za proste rozwiązanie.
Car Bomba
To rozwiązanie jest funkcjonalnie takie samo jak MissingDllHack . Może wydawać się czystszy, ale wprowadza kod obejścia do klasy kontekstowej. Kod ten zostanie również oznaczony do usunięcia przez narzędzia takie jak ReSharper i z czasem może zostać łatwo utracony. Dobre rozwiązanie, ale wolę, aby obejście to było oddzielone od kontekstu w sposób, który nie generuje ostrzeżeń kodu.
Timothy Schoonover,
20

Użyłem rejestracji opartej na Kodeksie dla dostawcy. link1 link2

Właśnie utworzyłem klasę konfiguracji jak

class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        this.SetDatabaseInitializer(new DropCreateDatabaseAlways<MyDbContext>());
        this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}

Kluczowym punktem jest this.SetProviderServices (SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);

i użyłem go w taki sposób

[DbConfigurationType(typeof(DbContextConfiguration))]
public class MyDbContext : DbContext
{
    public MyDbContext()
    {
        ...
    }

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ...
    }
}
vkuschenko
źródło
Mam dwa projekty w jednym rozwiązaniu. Pierwszym z nich jest biblioteka klas z zestawem struktury encji, klasą DbContext i plikami tt. Drugi projekt to formularze systemu Windows, które powinny uzyskiwać dane przy użyciu projektu ef. @Nash: Czy możesz opracować, gdzie (do którego projektu) umieściłeś swoją klasę DbContextConfiguration? Dzięki
surfmuggle,
Jak wspomniano powyżej, wydaje się, że dodatkowe odniesienia są jednym ze sposobów, aby to naprawić (patrz komentarz Erica). Użyłem konsoli nuget i uruchomiłem to polecenie: Get-Project MyWinformsProject | Install-Package EntityFrameworkto naprawiło to dla mnie. Nadal chciałbym lepiej zrozumieć przyczynę.
surfmuggle
Wydawało się, że DbContextConfiguration jest już obecny (vs 2013), dodanie linii DbConfiguraton powyżej mojej klasy MyDbContext nie rozwiązało problemu.
Anders Lindén,
Nie potrzebujesz klasy DbConfiguration . Umieść następujący kod w app uruchamiania (przed użyciem EF) DbConfiguration.Loaded += (sender, e) => e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);.
Rosberg Linhares
14

Rozwiązałem to za pomocą [DeploymentItem] na mojej klasie inicjalizującej zestaw

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());
        }
    }
}
Losowy
źródło
9

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ł

  <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>
jeriley
źródło
Prawdziwe rozwiązanie!
Ben F
8

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

Bibliografia

Matej
źródło
Zrobiłem to i zadziałało. Zasadniczo projekt wyświetli ostrzeżenie, gdy komponenty do bibliotek nie zostaną poprawnie odesłane.
kbvishnu,
5

Rozwiązałem to, ręcznie kopiując EntityFramework.SqlServer.dllplik do bin foldergłównej aplikacji.

Sreeja Sj
źródło
4

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.

ashutosh raina
źródło
4

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;

Innovation Wang
źródło
3

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.

Takitha Jayawickrama
źródło
2
Skonfigurowałem „Kopiuj lokalnie” true tylko dla „EntityFramework.SqlServer”. Teraz działa.
Alezis,
3

Wystarczy odwołać się do przeglądarki dll lub przeglądać plik EF - EntityFramework.SqlServer.dll

yogihosting
źródło
Oto co zrobiłem. Skopiowałem odniesienie do „EntityFramework.SqlServer” z mojej biblioteki do „działającego” projektu. To się udało!
Håkon K. Olafsen
3

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.

Install-Package EntityFramework.SqlServerCompact
Alishan
źródło
3

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 { }

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);
    }
}

hatsrumandcode
źródło
1
Dzięki! To była ogromna pomoc.
Addison Schuhardt
1
Cieszę się, że moja odpowiedź była pomocna @AddisonSchuhardt :)
hatsrumandcode
2

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:

cp $(TargetDir)EntityFramework.SqlServer.dll $(SolutionDir){your-main-bin-folder}
patrickbadley
źródło
2

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.

    /// <summary>
    /// So that the test runner copies dlls not directly referenced by the integration project
    /// </summary>
    private void referenceLibs()
    {
        var useless = SqlProviderServices.Instance;
    }
hal9000
źródło
2

Po wypróbowaniu wszystkich innych sugerowanych rozwiązań i nie uruchomieniu mojego projektu, w końcu znalazłem mały komentarz na tej stronie :

Usunięcie folderu BIN zrobiło to dla mnie

I to też działało dla mnie.

Ulisses Alves
źródło
1
Łączyłem 2 gałęzie - mój projekt nie miał żadnych zmian związanych z EF, ale moje jednostajne prace zaczęły się nie udawać bez powodu. Usunięcie folderu BIN sprawiło, że znów działały.
Arno Peters
@ Zeek2 ten błąd jest trudny. Na stronie, którą zacytowałem, jest wiele różnych propozycji rozwiązania tego problemu. To tylko jedno z wielu możliwych rozwiązań. Kontynuuj badania, aż znajdziesz rozwiązanie, które będzie dotyczyło konkretnego problemu. Powodzenia.
Ulysses Alves
1

Dodanie Entityframework.dll i Entityframework.sqlserver.dll do projektu referencyjnego rozwiązało problem.

Nish
źródło
1

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.

yW0K5o
źródło
1

Miałem również podobny problem

Mój problem został rozwiązany przez wykonanie następujących czynności:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

BehrouzMoslem
źródło
1

Miałem ten sam problem z DBContextobiektem 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

Code_Worm
źródło
0

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

pastrami01
źródło
0

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

Robert K.
źródło
0

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.

ChinaHelloWorld
źródło
0

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

Farrukh Najmi
źródło
0

usuń strukturę encji z projektu za pomocą nugetu, a następnie dodaj ją ponownie.

Gryf
źródło
0

W moim przypadku dllnie został skopiowany, chociaż dodałem do niego odniesienie. Jest tak, ponieważ EntityFramework.SqlServer.dllnie 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.

Baqer Naqvi
źródło
0

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.

Mauricio Atanache
źródło