Wyjątek EF 4.1 „Dostawca nie zwrócił ciągu ProviderManifestToken”


88

Próbuję odtworzyć przykład znaleziony w witrynie MSDN. Używam ASP.NET i EF 4.1 (CTP?). Użyłem NuGet do zainstalowania pakietu EntityFramework.

Otrzymuję ten błąd: The provider did not return a ProviderManifestToken string... a baza danych nigdy nie jest tworzona.

Oto moje parametry połączenia:

<add name="HospitalContext"
   connectionString=
   "data source=.\SQLExpress;initial catalog=NewTestDB;integrated security=True;"
   providerName="System.Data.SqlClient"/>

Oto mój kod:

var pat = new Patient { Name = "Shane123132524356436435234" };
db.Patients.Add(pat);

var labResult = new LabResult { Result = "bad", Patient = pat };

int recordAffected = db.SaveChanges();

Oto mój kontekst:

public class HospitalContext : DbContext
{
    static HospitalContext()
    {
        Database.SetInitializer(new HostpitalContextInitializer());
    }

    public DbSet<Patient> Patients { get; set; }
    public DbSet<LabResult> LabResults { get; set; }
}

public class HostpitalContextInitializer :
             DropCreateDatabaseIfModelChanges<HospitalContext>
{
    protected override void Seed(HospitalContext context)
    {
        context.Patients.Add(new Patient { Name = "Fred Peters" });
        context.Patients.Add(new Patient { Name = "John Smith" });
        context.Patients.Add(new Patient { Name = "Karen Fredricks" });
    }
}

To jest w pełni poprawiony system SQL 2008 z VS 2010 SP1.


Wydawałoby się, że po dodaniu [Klucza] do Modelu działa on po tym problemie. Nadal mam inny problem, ale to mogło go rozwiązać.
bugnuker

Możliwe też, że dodałem „Zintegrowane zabezpieczenia = prawda” do moich parametrów połączenia ...
bugnuker

Mam ten sam wyjątek podczas pracy zSqlServerCe.Entity.dll
Nano Taboada

2
W interesie rzeczy, które mogą wywołać ten wyjątek - spędzam 20 minut wpatrując się w literówkę w nazwie parametrów połączenia, które muszą pasować do nazwy kontekstu.
justSteve

Odpowiedzi:


184

Otrzymałem ten błąd i wypróbowałem kilka wcześniejszych sugestii. Następnie sprawdziłem wyjątek wewnętrzny i zauważyłem, że otrzymuję prosty błąd logowania SQL dla użytkownika. Jeszcze coś do sprawdzenia.


W moim przypadku hasło serwera sql wygasło
mklein

3
Dzięki za wskazanie mi właściwego kierunku. Moja usługa SQL Express nie została uruchomiona - prawda!
camainc

Dobry, wewnętrzny wyjątek ... Miałem błędną nazwę mojej bazy danych, kiedy wskazałem EF na nową lokalizację kopii zapasowej ... zabawne, sprawdziłem InnerEx i twój komentarz sprawił, że wróciłem i ponownie go przeczytałem ... kudos!
Andy Danger Gagne

Korzystałem ze zintegrowanych zabezpieczeń, pakiet aplikacji IIS nie miał wymaganych uprawnień.
Vincent Vancalbergh,

+1 - (Moje domowe IP zostało zmienione) Komunikat o błędzie: Nie można otworzyć serwera „SERVERNAME” żądanego przy logowaniu. Klient z adresem IP „MY_OLD_IP” nie może uzyskać dostępu do serwera. Aby włączyć dostęp, użyj portalu SQL Azure Portal lub uruchom sp_set_firewall_rule w głównej bazie danych, aby utworzyć regułę zapory dla tego adresu IP lub zakresu adresów. Zastosowanie tej zmiany może zająć do pięciu minut. \ R \ nZalogowanie użytkownika „MYADMINACCT” nie powiodło się. \ R \ n Sesji tej przypisano identyfikator śledzenia „GUID”. Podaj ten identyfikator śledzenia obsłudze klienta, gdy potrzebujesz pomocy. ”}
Dylan Hayes,

8

Może się to czasami zdarzyć, gdy umieścisz parametry połączenia w pliku app.config niewłaściwego projektu w programie Visual Studio.

Na przykład ten problem wystąpił w projekcie EF 4.1 (wersja wydana) + projekt usługi danych WCF i zauważyłem, że nie mam parametrów połączenia określonych w projekcie usług danych, w którym był używany.


To było moje rozwiązanie. Musiałem umieścić odpowiednie parametry połączenia w projekcie startowym.
MickJuice,

5

Miałem ten sam błąd, aw rzeczywistości był to błąd logowania na podanym serwerze. Usunąłem atrybut „Integrated Security” z parametrów połączenia konfiguracji i zadziałał.


To zadziałało dla mnie. Każdy, kto ma ten problem, powinien spróbować tego, jeśli inne rozwiązania nie działają.
Justin

Ten błąd wystąpił, gdy usługa SQL Express została wyłączona na moim komputerze.
John M

4

Miałem ten sam problem i dodaję poniższy kod zaraz po wystąpieniu mojego kontekstu (załaduj przez przykład)

context.Database.Connection.ConnectionString = @"Data Source=.\SQLExpress;Initial Catalog=Test;Integrated Security=True";


2

Z jakiegoś powodu pozwolenia EF nie może utworzyć połączenia z bazą danych. Miałem ten sam problem przez cały dzień. W końcu wypróbowałem następujące rozwiązanie i zadziałało: a / Otwórz IIS (używam IIS 7) b / Otwórz zaawansowane ustawienia appool, z którego korzystała witryna internetowa (np. DefaultAppPool) c / Spójrz na grupę Model procesu, zmień wartość tożsamości do „System lokalny”

Mam nadzieję, że to zadziała.


2

Miałem ten sam problem ...
rozwiązanie, które zadziałało, to:
uruchom narzędzie do konfiguracji sieci klienta (wpisz cliconfg w Run)
i upewnij się, że protokół TCP / IP jest włączony.


2

W końcu go złamałem - po krótkiej pogoni za dziką gęsią myślę, że to z powodu uprawnień.

Rewelacja: UŻYJ PROFILERA SQL

(Uwaga: niedawno obniżyłem wersję z EF6 do EF5)

Korzystając z SQL Profiler szybko znalazłem ostatni SQL wykonany przed zgłoszoną awarią:

SELECT TOP (1) 
[Project1].[C1] AS [C1], 
[Project1].[MigrationId] AS [MigrationId], 
[Project1].[Model] AS [Model]
FROM ( SELECT 
    [Extent1].[MigrationId] AS [MigrationId], 
    [Extent1].[Model] AS [Model], 
    1 AS [C1]
    FROM [dbo].[__MigrationHistory] AS [Extent1]
)  AS [Project1]
ORDER BY [Project1].[MigrationId] DESC

Spójrz na to - coś związanego z migracjami. To wygląda na __MigrationHistorystole - co nie miałem nawet sobie sprawę, że stworzył (ja już wymazane Migracje w moim CSPROJ) i wyczyszczone, że obecnie.

Wyciągam więc wiersze tej tabeli i widzę, że jest ona powiązana z określoną wersją produktu (v6).

wprowadź opis obrazu tutaj

Właściwie zdegradowałem z EF6 (którego nie zamierzałem instalować w pierwszej kolejności) na EF5 (który jest bardziej kompatybilny z rusztowaniami) i wtedy zaczęły się problemy.

Domyślam się, że Model (<Binary data>)kolumna nie jest kompatybilna wstecz - stąd The provider did not return a ProviderManifest instancebłąd, ponieważ nie można jej zdekodować.

Nie miałem nic do stracenia i po prostu całkowicie wyczyściłem ten stół i pobiegłem, Update-Database -Verbosea potem wróciłem do pracy.

Jeśli jesteś w zaawansowanym środowisku lub jesteś już w produkcji, wyczyszczenie tej tabeli może nie być rozwiązaniem, ale w ten sposób pozwolił mi od razu wrócić do pracy.


Skończyło się na tym, że całkowicie porzuciłem tabelę __MigrationsHistory i ponownie utworzyłem rusztowanie z Add-Migrationi Update-Database -Verbose -Force. tutaj jest opis polecenia coding.abel.nu/2012/03/ef-migrations-command-reference
Simon_Weaver

ważne jest to, że nie jest to wyłącznie błąd uprawnień
Simon_Weaver

1

Używając Visual Studio 11 Beta z EF4.1 i ASP.NET MVC, prawie wyrywałem sobie włosy, dopóki nie znalazłem

http://connect.microsoft.com/VisualStudio/feedback/details/740623/asp-net-mvc-4-default-connection-string-improperly-escaped

Aby naprawić mój problem, wszedłem do Application_Start i zmieniłem

Database.DefaultConnectionFactory = new SqlConnectionFactory ("Źródło danych = (localdb) \ v11.0; Integrated Security = True; MultipleActiveResultSets = True");

do

Database.DefaultConnectionFactory = new SqlConnectionFactory ( @ "Źródło danych = (localdb) \ v11.0; Integrated Security = True; MultipleActiveResultSets = True");


Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");został dodany do mojego Mainmehod, teraz działa jak urok! Dziękuję bardzo.
rotgers

1

Ten błąd występuje tylko wtedy, gdy plik .edmx jest otwarty i znika, gdy tylko plik zostanie ponownie zamknięty.

Ten cytat z CodePlex , zadziałał ze mną (Visual Studio 2013 / MVC 5)


Ze mną też pracował. Próbowałem zamknąć i ponownie otworzyć plik edmx. Pracował.
Rohit

1

Inną rzeczą do rozważenia, jeśli używasz EF Code First, jest to, że czasami nie tworzy automatycznie zapasowej bazy danych w klasie DbContext. Rozwiązaniem jest dodanie własnych parametrów połączenia - jako szablonu można użyć parametrów połączenia, które mogą być obecne do obsługi bazy danych użytkowników / rejestracji, która obsługuje dostawcę prostego członkostwa. Na koniec musisz dodać domyślny konstruktor dla utworzonej klasy DbContext:

public ChaletDb():base("ChaletConnection")
    {

    }

W tym przypadku nazwa parametrów połączenia wprowadzona w pliku web.config jest używana do kierowania DbContext do tworzenia bazy danych. Bardzo rzadko musiałem ręcznie utworzyć bazę danych (w SQL Server Management Studio), co skłoniło ją do działania.


0

Mam wiele projektów w rozwiązaniu i dodałem EF do każdego projektu w różnym czasie. Na niektórych komputerach działał, a na niektórych zawiódł z powodu wspomnianego błędu. Zajęło mi trochę czasu, zanim zauważyłem, że plik app.config mojego projektu zawierał to:

    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>

Jest to w porządku, jeśli używasz LocalDb (nowe "sql express"), ale całkowicie błędne, jeśli nie masz zainstalowanego tego konkretnego serwera i używasz zwykłego SQL.

Rozwiązanie: Usuń powyższy kod.


0

Dzieje się tak, ponieważ połączenie z serwerem SQL nie powiodło się.

Upewnij się, że konto użytkownika, pod którym uruchamiasz proces, ma dostęp do programu SQL Server.

Jeśli wygenerowano DbContext z wątku nadrzędnego (jak przy użyciu iniekcji zależności), a następnie, jeśli personifikujesz innego użytkownika, wystąpi ten błąd. Rozwiązaniem byłoby wygenerowanie DbContext w nowym wątku lub nowym kontekście personifikacji.


0

Właśnie zamknąłem wszystkie wystąpienia programu Visual Studio i ponownie otworzyłem swoje rozwiązanie.

Nie wiem, co się naprawdę stało, ale otworzyłem to samo rozwiązanie z dwóch różnych lokalnych obszarów roboczych (jeden z moimi lokalnymi zmianami, drugi z niezmienionym kodem źródłowym repozytorium). Pracuję z postgres DB, Entity Framework 6, Visual Studio 2013 i ASP.NET MVC 5.


0

Wystąpił błąd dotyczący struktury jednostki, ale żadna z powyższych odpowiedzi nie pasowała do rozwiązania, które w końcu zadziałało.

Moje modele EntityFramework Code First i DataContext znajdowały się w osobnym projekcie z mojego głównego projektu WebAPI. Mój projekt Entity Framework gdzieś na końcu linii kodowania został ustawiony jako projekt startowy i dlatego podczas przeprowadzania migracji otrzymywałem komunikat „Dostawca nie zwrócił ciągu ProviderManifestToken” ... problem z połączeniem.

Okazuje się, że skoro ConnectionString do DB znajduje się w pliku Web.config w głównym projekcie WebAPI, to podczas przeprowadzania migracji parametry połączenia nie były pobierane. Ustawiając projekt WebAPI jako mój startProject, mogłem pomyślnie się połączyć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.