【问题标题】:Local App_Data\ASPNETDB.MDF keeps being created本地 App_Data\ASPNETDB.MDF 不断被创建
【发布时间】:2017-05-24 01:31:24
【问题描述】:

编写 MVC5 应用程序。出于某种原因,本地 App_Data\ASPNETDB.MDF 数据库不断被创建,即使在我的 web.config 中我指定的唯一数据库是网络上完全不同的数据库(并且工作正常。)可能是什么创建了这个数据库(并重新创建,如果我删除它)?我在我的解决方案中搜索了 ASPNETDB.MDF 并没有出现任何内容,因此它不在任何类型的配置文件等中......

我的 web.config 的 connectionStrings 部分......

<connectionStrings>
  <remove name="ZZZ_SpringContext" />
  <add name="ZZZ_SpringContext" 
       connectionString="Data Source=mypc\sql2012;Initial Catalog=ZZZ_Spring;Integrated Security=True;MultipleActiveResultSets=True" 
   providerName="System.Data.SqlClient" />

</connectionStrings>

***** 更新 *****

我尝试再次删除数据库。然后在我的 web.config 中,我将 rolemanager 行更改为 false,并且数据库现在没有重新创建。这有助于我了解创建数据库的原因。但是,我怎样才能解决这个问题?这是 web.config 中的行......

    <roleManager enabled="false" />

我必须将其改回“true”,这样我的应用才能正常运行。

【问题讨论】:

  • 也许是 AspNet 身份?当您使用 Visual Studio 或 SSMS 打开数据库时,您会看到哪些表?
  • @maxbeaudoin 我正在使用身份,但所有表都在 web.config 中定义的数据库中。我无法查看 ASPNETDB.MDF 数据库的内容。我将它包含在我的项目中并打开它,它说“这个 db 文件与 SQL Server 的当前实例不兼容。”每次我删除它并运行应用程序时,它都会重新创建。
  • 您能否在 web.config 中包含 connectionStrings 部分?
  • @maxbeaudoin 我把它包括在上面了。谢谢
  • 生成的 ASPNETDB 数据库通常来自 MembershipSimpleMembership 提供程序,并启用了自动创建数据库,它在完成数据库初始化过程之前以某种方式使用Membership 功能,它在App_Data 文件夹中创建了 ASPNETDB 数据库.包括您的控制器代码,其中可能包含 AuthorizeInitializeSimpleMembership 属性。

标签: asp.net-mvc visual-studio


【解决方案1】:

在过去,我遇到了几乎相同的问题,即 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 及其日志文件默认表定义。

为防止重新创建该数据库,除了更改 &lt;roleManager enabled="false"&gt; 之外,您还可以在 web.config 中使用以下步骤:

  1. 在定义自己的连接字符串之前清除现有或预定义的连接字符串。

    <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>
    
  2. 删除模块定义中的RoleManager 提供程序。

    <modules>
      <remove name="RoleManager" />
    </modules>
    
  3. 如有必要,请注释掉所有 membershipprofileroleManager 元素。

  4. 如果您的帐户模型代码有 UsersContext 类,请确保它指向您自己定义的当前连接字符串。

    public class UsersContext : DbContext
    {
        public UsersContext() : base("ZZZ_SpringContext")
        {
        }
    }
    

相关问题:

How do I stop using ASPNETDB.MDF in LocalDB?(WebForms 版本)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多