2012-10-15 64 views
8

我正在努力獲得在我的EntityFramework/MVC4/DatabaseFirst項目中工作的簡單成員方案。我已經找到了很多用於處理代碼的例子,但首先沒有提及DB。SimpleMembershipInitializer不會初始化

我遇到的是在InitializeDatabaseConnection拋出一個錯誤的問題(「無法找到所請求的.NET Framework數據提供它可能沒有安裝。」)的代碼如下所示:

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

我不確定DataProvider失敗。如果我試圖追蹤'進入'InitializeDatabaseConnection調用,它會立即拋出錯誤。

我錯過了什麼?

信息:
DALEntities是其餘EF使用的connectionString的名稱。下面的代碼工作得很好....

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

我的連接字符串從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> 

這個職位似乎是問同樣的問題(但在基於模型的情況下第一個),但目前還沒有解決方案:Using SimpleMembership with EF model-first

此外,我看到WebSecurity.InitializeDatabaseConnection()有一個過載,幫助文本爲: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。我希望連接到MSSQL服務器......這將是必需的?

+0

我的項目不喜歡使用EF連接字符串。相反,我不得不添加第二個連接字符串,它是SQL連接字符串(或sql compact)。我沒有玩過它,所以別人可能會有更好的想法 – Eonasdan

+0

它值得一試...但絕對感覺像一個短期的解決方法... – reidLinden

+0

是的,這工作繞過錯誤,但我不不認爲它可能是一個好主意,連接到我的EF數據庫沒有EF的好處....? – reidLinden

回答

7

提供給你麻煩的提供者是你的連接字符串System.Data.EntityClient中指定的提供者。我懷疑這個問題是因爲你的項目是數據庫優先的,而簡單的成員是先使用代碼。我不認爲你可以在單個數據庫中混合使用這些方法。嘗試將它放回到IntializeDatabaseConnection所使用的DefaultConnection的位置。在你的web.config中應該有一個由MVC4腳手架生成的DefaultConnection。此連接字符串通常使用System.Data.SqlClient作爲提供程序。

如果您想保留用於存儲域信息的數據庫(即DALEntities)中的簡單成員資格,那麼您將需要更改在域上使用EF的方法以先行代碼。如果您想保留您的項目數據庫 - 首先您需要在數據庫中設計自己的成員資格模式,並且需要develop custom member and role providers。如果您真的試圖將用戶信息集成到您的域模型中,這可能是最好的方法。

+0

我同意你關於'System.Data.EntityClient',但我需要針對我的常規數據庫進行用戶管理。對於我來說,擁有不同的數據庫並不是一個可行的解決方案。 – reidLinden

+0

@reidLinden - 我根據您的意見更新了我的答案。 –

+0

謝謝。我明白你在說什麼,我想它完全回答了我的問題。 – reidLinden

1

爲了簡單和清晰,請將兩個連接字符串指向同一個數據庫。一個用於EF(不管是代碼優先還是數據優先)和一個用於WebSecurity的東西。 (作爲乍得和Erik所述)

<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" /> 

注意,提供者是不同的:EF使用System.data.EntityClient和非EF一個使用System.Data.SqlClient的。