8

我正在努力在我的 EntityFramework / MVC4 / DatabaseFirst 项目中获得一个简单的成员资格方案。我发现了很多首先使用代码的示例,但没有先使用 DB。

我遇到的问题是 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 服务器……这需要吗?

4

2 回答 2

7

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

如果您想在用于存储域信息(即 DALEntities)的数据库中保留简单的成员资格,那么您需要将在域上使用 EF 的方法更改为代码优先。如果您想首先保留项目数据库,您需要在数据库中设计自己的成员模式并开发自定义成员和角色提供程序。如果您真的想将用户信息集成到您的域模型中,这可能是最好的方法。

于 2012-10-15T20:15:35.273 回答
1

为了简单明了,保留两个连接字符串指向同一个数据库。一个用于 EF(无论是代码优先还是数据优先),一个用于您的 WebSecurity 东西。(正如乍得和埃里克所说)

<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。

于 2014-08-03T20:08:23.973 回答