将 SQL Server Compact 与 ASP.NET Identity 结合使用

h b*_*bob 5 asp.net asp.net-mvc entity-framework sql-server-ce asp.net-identity

我正在使用最新的 ASP.NET MVC、身份和实体框架。

示例Identity 项目使用 Sql Server Express。我想使用 Sql Server Compact。

我做了什么:

  • 创建了一个新的空解决方案(不是 MVC 模板)

  • 安装的示例项目:Install-Package Microsoft.AspNet.Identity.Samples -Pre

  • 安装:Install-Package Microsoft.SqlServer.Compact

  • 安装:Install-Package EntityFramework.SqlServerCompact

  • 将默认连接字符串更改为web.config

    <add name="Foo" 
         providerName="System.Data.SqlServerCe.4.0" 
         connectionString="Data Source=|DataDirectory|\Foo.sdf;" />
    
    Run Code Online (Sandbox Code Playgroud)
  • 更改ApplicationDbContext为使用Foo连接字符串:

    ApplicationDbContext() : base("name=Foo", false)
    
    Run Code Online (Sandbox Code Playgroud)

问题是,ApplicationDbContext第一次访问时(在播种期间,在ApplicationDbInitializer.InitializeIdentityForEF()方法中):

  • 数据库已创建
  • 我得到了一条InvalidOperationException: UserId not found线路result = userManager.SetLockoutEnabled(user.Id, false);

我认为这就像更改连接字符串一样简单 - 那么我做错了什么?换句话说,如何将解决方案从 SQL Server Express 转换为 SQL Server Compact?

h b*_*bob 4

发现错误了。我的连接字符串是错误的,我有:

<add name="Foo"
     providerName="System.Data.SqlServerCe.4.0"
     connectionString="
       Data Source=|DataDirectory|\Foo.sdf;
       Persist Security Info=false;
       "/>
Run Code Online (Sandbox Code Playgroud)

这是行不通的(XML,所以认为空格会被忽略,但事实并非如此),而这行得通:

<add name="Foo"
     providerName="System.Data.SqlServerCe.4.0"
     connectionString="Data Source=|DataDirectory|\Foo.sdf;Persist Security Info=false;" />
Run Code Online (Sandbox Code Playgroud)

无论如何,问题本身包含将 sqlce 与 Identity2 结合使用的分步说明。也许它会对某人有所帮助。