2013-03-04 22 views
7

Próbuję skonfigurować prostą aplikację webową ASP.NET MVC 4 przy użyciu pierwszych migracji DB z SQL Server (2005). Stworzyłem tabele w bazie danych i użyłem Entity Framework do tworzenia obiektów w kodzie. Mogę uzyskać dostęp do danych za pomocą tych obiektów.Nie można znaleźć żądanego dostawcy danych .Net Framework. (SqlClient)

Problemy pojawiają się, gdy próbuję zainicjować WebSecurity przy użyciu WebSecurity.InitializeDatabaseConnection("FLMREntities", "UserProfile", "UserId", "UserName", true); w pliku Global.asax.cs. Próbowałem użyć filtr InitializeSimpleMembershipAttribute, który był dołączony do szablonu i otrzymałem ten sam problem. Pojawia się komunikat o błędzie:

Unable to find the requested .Net Framework Data Provider. It may not be installed. 

Oto odpowiedni ciąg połączenia:

<add name="FLMREntities" 
    connectionString="metadata=res://*/Models.FLMR.csdl|res://*/Models.FLMR.ssdl|res://*/Models.FLMR.msl; 
        provider=System.Data.SqlClient; 
        provider connection string=&quot;data source=notes.marietta.edu; 
         initial catalog=muskwater; 
         user id=muskwater;password=********; 
         MultipleActiveResultSets=True; 
         App=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" /> 

Także mam utworzone tabele członkostwa w bazie danych, aby dopasować to, co tworzy szablon. Jeśli zmienię parametr końcowy w wywołaniu Initialize na false (aby nie próbował on automatycznie tworzyć tabel), zwraca to, że nie może znaleźć tabeli UserProfile. Próbowałem także odmiany nazw, takich jak [dbo]. [UserProfile].

Wystarczy mieć prosty model konta, aby umożliwić użytkownikom logowanie się i zezwolić niektórym użytkownikom na oglądanie większej ilości treści.

+0

Czy masz '' przed ciągami połączenia? Aby zapobiec dziedziczeniu jakiejkolwiek innej konfiguracji – Basic

+0

Nie mam innych ciągów połączeń w tym projekcie. Skomentowałem tę z szablonu. Czy nadal potrzebowałbym '' i czy byłby on na tym samym poziomie zagnieżdżenia, jak ten powyżej? – amoscardino

+0

Jest możliwe, aby konfiguracja maszyny/serwisu obejmowała ciągi połączeń do aplikacji. Niektóre frameworki też. '' powinien być pierwszym elementem w tej samej sekcji, co ciąg połączenia (kolejność jest zachowywana po załadowaniu sekcji konfiguracji). – Basic

Odpowiedz

1

Może to być duplikat this.

Z tego co pamiętam o tym problemie, należy się upewnić, że dostawca sqldata jest zarejestrowany. Czasami w pliku machine.config znajduje się zduplikowany wpis, który należy usunąć, a jeśli dobrze pamiętam, może być błędny wpis, który należy usunąć. Spójrz na this msdn post, informacja o tym jest o połowie strony.

Łącze do innych SO ma kilka linków, które mogą być pomocne. Jeśli to nie kończy się oznaczeniem jako duplikatem pytania, mogę je również dodać tutaj lub cokolwiek jest właściwe.

Sekcja szukasz będzie wyglądać podobnie do tego myślę:

<system.data> 
    <DbProviderFactories> 
    <add name="SqlClient Data Provider" 
    invariant="System.Data.SqlClient" 
    description=".Net Framework Data Provider for SqlServer" 
    type="System.Data.SqlClient.SqlClientFactory, System.Data, 
    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    /> 
    </DbProviderFactories> 
</system.data> 

Z informacji podałeś w komentarzach, wydaje się, że brakuje w machine.config. O ile się nie mylę (możliwe), to znaczy, że dostawca SQL nie jest zarejestrowany na twoim komputerze. Konieczne będzie dodanie powyższej sekcji do pliku web.config. Musisz również upewnić się, że do projektu odwołuje się System.Data.SqlClient.

Jeśli nie jest zainstalowany na komputerze docelowym, będziesz mieć więcej pracy, aby go zainstalować. Chciałbym móc ci w czymś pomóc, ale kiedy to zrobiłem, było to dla SqlServerCE, więc pliki, których używałem, są bardzo różne.

Powodzenia!

EDYCJA: Najważniejszą informacją jest wersja, która musi pasować do pliku, którego używasz. in type = "blabh..blah..blah..Version = 2.0.0.0, blah blah", która musi być wersją pliku, którego używasz, więc kliknij prawym przyciskiem myszy plik i pobierz wersję pliku. Jeśli się nie powiedzie, wypróbuj wersje tej wersji. Wierzę, że mój plik był 2.0.0.1, ale wersja = 2.0 jest tym, co zadziałało, kiedy to zrobiłem. Po prostu wypróbuj kilka różnych wersji na podstawie numeru wersji (na przykład 2.0, 2.0.0, 2.0.0.1).

+0

Odpowiedź w tym pytaniu naprawdę nie wyjaśnia, jak rozwiązać problem. Zlokalizowałem plik machine.config i są tylko pozycje DbProviderFactory dla SqlServerCe. Czy muszę dodać wpis dla SqlClient? Czy będzie wyglądać jak ta, którą opublikowałeś? – amoscardino

+0

Nie modyfikowałbym pliku machine.config, chyba że wiesz, co robisz. Pozwól mi sprawdzić, czy uda mi się znaleźć zasoby, których użyłem, gdy miałem ten problem, abyś miał lepszy pomysł. –

+0

Również, FYI, kiedy miałem dokładnie ten sam błąd jak ty (to było w czasie wykonywania), to było rozwiązanie. Musiałem się upewnić, że rozmieściłem poprawne pliki i musiałem dodać sekcję, którą umieściłem na moim web.config. –

0

Po prostu chciałem zadzwonić tutaj, że miałem ten problem, patrząc na mój machine.config dla docelowej wersji .NET, z której uciekłem ...w strukturze:

upewnić się, że kierowane dostawcy danych są prawidłowo wprowadzone w ciągu istnieje, tylko jeden na dostawcy (Widziałem duplikaty powodować problemy), a także upewnić się, że jest on ważny XML i masz tylko jeden wpis DBProviderFactories. W moim przypadku miałem wpis po pierwszym wpisie (zasadniczo dwa wpisy, jeden z moimi dostawcami, jedno puste), a puste było przyczyną wszystkich problemów.

Nadzieja to pomaga kogoś z tej samej kwestii :)

4

miałem podobny problem, co zrobiłem: I zmodyfikowane połączenie domyślne. Miałem już ciąg połączenia dla modelu edmx, który wyglądał tak:

<add name="ChemicalReporterEntities" connectionString="metadata=res://*/ChemicalDB.csdl|res://*/ChemicalDB.ssdl|res://*/ChemicalDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLExpress;initial catalog=ChemicalReporter;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

Ale nie mogę stosować go z dostawcą SimpleMemebrship. Więc w Visual Studio Otworzyłem Explorer Serwer> Połączenia danych wybrałem moje połączenie, kliknij prawym przyciskiem myszy, właściwości i skopiowane ciąg połączenia stamtąd i wklejać je do defaultConnection:

<add name="DefaultConnection" connectionString="Data Source=.\SQLExpress;Initial Catalog=ChemicalReporter;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework" providerName="System.Data.SqlClient" /> 

Potem zmienił WebSecurity.InitializeDatabaseConnection używać DefaultConnection.

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", true); 
Powiązane problemy