在过去,我遇到了几乎相同的问题,即 ASPNETDB.mdf 文件即使已删除,仍会重新创建。原来 ASP.NET Identity 实例在项目外部使用machine.config 文件,该文件具有以下行:
<connectionStrings>
<add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
在配置文件的末尾,我发现了 membership 元素,它似乎控制着 Membership 提供者的行为:
<system.web>
<membership>
<providers>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
</providers>
</membership>
<profile>
<providers>
<add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</profile>
<roleManager>
<providers>
<add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<add name="AspNetWindowsTokenRoleProvider" applicationName="/" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
</system.web>
请注意,connectionStringName="LocalSqlServer" 指的是 ASPNETDB.mdf,如之前的 connectionStrings 元素所示。
然后,在项目内部的 web.config 中,此行确定是否启用了 RoleManager 实例:
<roleManager enabled="true">
<providers>
<clear/>
<add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
<add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
</providers>
</roleManager>
上面给出的行表明 ASP.NET Membership 提供程序已启用为当前用户管理,这违背了 ASP.NET Identity 的目的。
因此,如果 ASPNETDB.mdf 数据库不存在并且启用了Membership 提供程序支持,则Membership 提供程序将使用 machine.config 中的默认配置设置进行初始化,并使用自动生成 ASPNETDB.mdf 及其日志文件默认表定义。
为防止重新创建该数据库,除了更改 <roleManager enabled="false"> 之外,您还可以在 web.config 中使用以下步骤:
-
在定义自己的连接字符串之前清除现有或预定义的连接字符串。
<connectionStrings>
<clear />
<remove name=LocalSqlServer /> <== this is maybe optional
<add name="ZZZ_SpringContext"
connectionString="Data Source=mypc\sql2012;Initial Catalog=ZZZ_Spring;Integrated Security=True;MultipleActiveResultSets=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
-
删除模块定义中的RoleManager 提供程序。
<modules>
<remove name="RoleManager" />
</modules>
如有必要,请注释掉所有 membership、profile 和 roleManager 元素。
-
如果您的帐户模型代码有 UsersContext 类,请确保它指向您自己定义的当前连接字符串。
public class UsersContext : DbContext
{
public UsersContext() : base("ZZZ_SpringContext")
{
}
}
相关问题:
How do I stop using ASPNETDB.MDF in LocalDB?(WebForms 版本)