2012-10-15 13 views
8

Mam problemy z uzyskaniem scenariusza simplemembership działającego w moim projekcie EntityFramework/MVC4/DatabaseFirst. Znalazłem mnóstwo przykładów do pracy z kodem jako pierwszym, ale nic z DB.SimpleMembershipInitializer nie zainicjuje

Problem mam napotykając jest The InitializeDatabaseConnection rzuca błąd ("Nie można odnaleźć żądanej Provider .Net Framework danych, które mogą nie być zainstalowane."). Kod wygląda następująco:

WebSecurity.InitializeDatabaseConnection("DALEntities", "tblContacts1", "ContactID", "EMail", autoCreateTables: true); 

Nie jestem pewien, co się dzieje z DataProvider. Jeśli spróbuję wyśledzić "do" wywołania InitializeDatabaseConnection, natychmiast zgłasza błąd.

Czego mi brakuje?

Informacje:
Dalentities to nazwa zestawu połączenia, którego używa reszta EF. Poniższy kod działa dobrze ....

public ActionResult Test() { 
     using (var db = new DALEntities()) { 
      var query = from i in db.TBLINVENTORies 
          orderby i.ITEMNAME 
          select i; 
      var cnt = query.Count(); 
      string str = "Total Inventory: " + cnt; 
      return Content(str); 
     } 
    } 

Moja sekcja ciągów połączenia z web.config:

<connectionStrings> 
    <add name="DALEntities" connectionString="metadata=res://*/DAL.DAL.csdl|res://*/DAL.DAL.ssdl|res://*/DAL.DAL.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SOMECOMPUTER;initial catalog=SOMEDB;persist security info=True;user id=SOMEID;password=SOMEPASS;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 

Ten post wydaje się być pytaniem samo pytanie (ale w kontekście model- pierwszy), ale nie ma jeszcze rozwiązania: Using SimpleMembership with EF model-first

Widzę również, że istnieje przeciążenie dla WebSecurity.InitializeDatabaseConnection() z tekstem pomocy: Initializes the membership system ((blah blah <snip> ProviderName: the name of the ADO.NET data provider. If you want to use Microsoft SQL Server, the WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection(String, String, String, String, Boolean) overload is recommended. I do chcesz połączyć się z serwerem MSSQL ... czy będzie to wymagane?

+0

moje projekty nie lubiły używać ciągu połączenia EF. zamiast tego musiałem dodać drugi ciąg połączenia, który był ciągiem połączenia SQL (lub sql compact). Nie grałem z tym zbyt dużo, aby ktoś mógł mieć lepszy pomysł. – Eonasdan

+0

Warto spróbować ... ale na pewno czuję się jak krótkoterminowe obejście ... – reidLinden

+0

Tak, to pomogło ominąć błąd, ale ja nie Myślę, że to chyba dobry pomysł, aby połączyć się z moją bazą danych EF bez korzyści płynących z EF ...? – reidLinden

Odpowiedz

7

Dostawca, który sprawia problemy, jest określony w ciągu połączenia, który jest System.Data.EntityClient. Podejrzewam, że problem polega na tym, że twój projekt jest oparty na bazie danych, podczas gdy proste członkostwo używa kodu jako pierwszego. Nie sądzę, że można mieszać te podejścia w jednej bazie danych. Spróbuj przywrócić go tam, gdzie DefaultConnection jest używany do IntializeDatabaseConnection. Powinien być DefaultConnection w twoim web.config wygenerowany przez rusztowanie MVC4. Ten ciąg połączenia zwykle używa System.Data.SqlClient jako dostawcy.

Jeśli chcesz zachować proste członkostwo w bazie danych używanej do przechowywania informacji o domenie (np. Dalentities), musisz zmienić metodę używania EF w domenie, aby najpierw kodować. Jeśli chcesz zachować bazę danych projektu - najpierw musisz zaprojektować swój własny schemat członkostwa w bazie danych i develop custom member and role providers. Jest to prawdopodobnie najlepsze podejście, jeśli naprawdę chcesz zintegrować informacje o użytkowniku z modelem swojej domeny.

+0

Zgadzam się z tobą na temat 'System.Data.EntityClient', ale muszę pracować przeciwko mojej zwykłej bazie danych do zarządzania użytkownikami. Nie jest praktycznym rozwiązaniem dla mnie posiadanie odrębnych baz danych. – reidLinden

+0

@reidLinden - zaktualizowałem swoją odpowiedź na podstawie Twoich komentarzy. –

+0

Dziękuję. Rozumiem, co mówisz, i myślę, że w pełni odpowiada na moje pytanie. – reidLinden

1

Dla uproszczenia i przejrzystości zachowaj dwa ciągi połączeń wskazujące na tę samą bazę danych. Jeden dla EF (nie ma znaczenia, jeśli pierwszy kod lub dane najpierw) i jeden dla rzeczy WebSecurity. (Jak Czadzie i Erik powiedział)

<add name="DataEntities" connectionString="metadata=res://*/Models.DataEntities.csdl|res://*/Models.DataEntities.ssdl|res://*/Models.DataEntities.msl;provider=System.Data.SqlClient;provider connection string='data source=[YOUR_SERVER];initial catalog=[YOUR_DATABASE];integrated security=True;MultipleActiveResultSets=True;App=[YOUR_APP_NAME]'" providerName="System.Data.EntityClient" /> 
<add name="DataDB" connectionString="data source=[YOUR_SERVER];initial catalog=[YOUR_DATABASE];integrated security=True;MultipleActiveResultSets=True;App=[YOUR_APP_NAME]" providerName="System.Data.SqlClient" /> 

Zauważ, że dostawcy są różne: EF korzysta System.data.EntityClient i non-EF używa System.Data.SqlClient.