MVC4 - 成员资格 - SQL Server Compact 4.0 - 例外:无法找到请求的.Net Framework数据提供程序

id.*_*.ot 1 asp.net-membership sql-server-ce asp.net-mvc-4 entity-framework-5

InitializeDatabaseConnection方法的文档说,我们可以用SQLCE(SQL Server精简4.0本地数据库)使用MVC 4"互联网"模板的生成会员功能.

我之前已经多次使用过这个模板,并且在我没有弄乱任何东西时只是使用了我们第一次注册用户时实体框架生成的localDb(默认).

我的要求是将默认情况下生成的成员资格表生成到2012 localDb数据库中,而不是生成到SQLCE数据库中.但是,我得到以下内容:

例外:无法找到请求的.Net Framework数据提供程序.它可能没有安装.

要做到这一点,我们只需:

  1. 打开Visual Studio(表达工作正常).
  2. 生成一个新的MVC4 - > Internet(带帐户)项目.
  3. 将SQLCE数据库添加到该~/App_Data/文件夹(右键单击该文件夹,然后选择添加 - > SQL Server Compact 4.0本地数据库).
  4. 然后将表添加到表中.
  5. 右键单击Models文件夹,然后选择Add - > ADO.NET Entity Data Model
  6. 打开(root)web.config并复制'connectionstring'(<add name="ceEntities")的名称
  7. ~/Filters/InitializeSimpleMembershipAttribute类中找到以下代码行:WebSecurity.InitializeDatabaseConnection("ceEntities", "UserProfile", "UserId", "UserName", autoCreateTables: true);
  8. F5编译/运行/调试项目
  9. 加载主页/索引页面后,单击右上角的"注册"链接
  10. 输入用户名和密码进行注册,然后单击"确定".

到目前为止,代码编译并运行正常,但是当在~/Filters/InitializeSimpleMembershipAttribute类中运行以下代码行时:

WebSecurity.InitializeDatabaseConnection("ceEntities", "UserProfile", "UserId", "UserName", autoCreateTables: true);
Run Code Online (Sandbox Code Playgroud)

捕获此异常: 无法找到请求的.Net Framework数据提供程序.它可能没有安装.

当我们将此代码添加到web.config时,这显然是修复:

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SqlServerCe.4.0" />
      <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    </DbProviderFactories>
  </system.data>
Run Code Online (Sandbox Code Playgroud)

当我们再次运行它时,会捕获以下异常:

无法找到请求的.Net Framework数据提供程序.它可能没有安装.

id.*_*.ot 5

感谢Scott Hanselman和任何让他了解SQLCE协议的成员资格提供程序的人,如他的介绍System.Web.Providers - 用于SQL Compact和SQL Azure的会话,成员资格,角色和用户配置文件的ASP.NET通用提供程序博客 Scott概述了实现ASP.NET Universal Providers的步骤.这有助于我概述SQLCE的正确连接字符串大纲:

<connectionstrings>
   <add name="Sql_CE" 
        connectionstring="Data Source=|DataDirectory|\MyWebSite.sdf;" 
        providername="System.Data.SqlServerCe.4.0">
   </add>
</connectionstrings>
Run Code Online (Sandbox Code Playgroud)

所以我将我的connectionstring更新为:

<connectionstrings>
   <add name="defaultconnection" 
        connectionstring="Data Source=|DataDirectory|\ce.sdf;" 
        providername="System.Data.SqlServerCe.4.0">
   </add>
</connectionstrings>
Run Code Online (Sandbox Code Playgroud)

然后connectionStringName~/Filters/InitializeSimpleMembershipAttribute课程更新回到:

WebSecurity.InitializeDatabaseConnection("defaultconnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
Run Code Online (Sandbox Code Playgroud)

应用程序编译时没有错误或异常,因此我运行应用程序然后注册用户,并在该过程中将适用的SimpleMembership表生成到我的"ce.sdf"(SQL Server Compact 4.0本地数据库)中.

我现在能够充分利用SimpleMembership默认值!

ps,为简洁起见,我现在要编辑我的初始帖子/问题以省略堆栈跟踪,只留下例外.