SimpleMembershipInitializer不会初始化

时间:2012-10-15 19:30:49

标签: asp.net-mvc-4 ef-database-first simplemembership

我正在努力在我的EntityFramework / MVC4 / DatabaseFirst项目中使用简单的成员方案。我已经找到了很多首先使用代码的例子,但是对于DB没有任何例子。

我遇到的问题是InitializeDatabaseConnection抛出一个错误(“无法找到请求的.Net Framework数据提供程序。它可能没有安装。”)代码如下所示:

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

我不确定DataProvider失败了什么。如果我尝试跟踪'into'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服务器......这是必需的吗?

2 个答案:

答案 0 :(得分:7)

提供麻烦的提供程序是在连接字符串中指定的System.Data.EntityClient。我怀疑问题是因为你的项目是数据库优先的,而简单的成员资格是使用代码优先。我认为您不能在单个数据库中混合使用这些方法。尝试将其重新放回到用于IntializeDatabaseConnection的DefaultConnection的位置。 MVC4脚手架生成的web.config中应该有一个DefaultConnection。此连接字符串通常使用System.Data.SqlClient作为提供程序。

如果要保留用于存储域信息的数据库中的简单成员资格(即DALEntities),则需要将在域上使用EF的方法更改为代码优先。如果您想首先保留项目数据库,则需要在数据库和develop custom member and role providers中设计自己的成员资格模式。如果您真的想要将用户信息集成到您的域模型中,这可能是最好的方法。

答案 1 :(得分:1)

为简单起见,请保留两个指向同一数据库的连接字符串。一个用于EF(无论是代码优先还是数据优先)和一个用于WebSecurity的东西。 (正如Chad和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。