【问题标题】:Configuring MVC for SimpleMembership为 SimpleMembership 配置 MVC
【发布时间】:2013-06-23 23:41:35
【问题描述】:

我有一个 ASP.NET MVC 应用程序,其中包含从项目模板生成的许多与成员资格相关的页面。

当我尝试访问其中一个页面时,我收到以下错误:

无法初始化 ASP.NET 简单成员资格数据库。更多信息请见http://go.microsoft.com/fwlink/?LinkId=256588

经过一段时间的研究,我确定我丢失了连接字符串。我有一个名为FreeWebFilesEntities 的现有连接字符串,我创建了一个名为DefaultConnection 的新连接字符串,并赋予它相同的值。

<connectionStrings>
    <add name="FreeWebFilesEntities" connectionString="metadata=res://*/FreeWebFilesRepository.csdl|res://*/FreeWebFilesRepository.ssdl|res://*/FreeWebFilesRepository.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=FreeWebFiles;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
    <add name="DefaultConnection" connectionString="metadata=res://*/FreeWebFilesRepository.csdl|res://*/FreeWebFilesRepository.ssdl|res://*/FreeWebFilesRepository.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=FreeWebFiles;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
<connectionStrings>

但它仍然不喜欢这样。我发现一些资源表明我正在使用 EF 连接字符串(我是)。我尝试删除它的元数据部分,但无论我做什么,它都会引发异常。

既然微软似乎决定不非常仔细地记录这个过程(如果有的话),有没有人弄清楚这一点?如何让 SimpleMembership 页面正常工作?

【问题讨论】:

    标签: asp.net-mvc web-config connection-string simplemembership


    【解决方案1】:

    好吧,首先,您使用的是EntityClient 连接字符串,它与SimpleMembership 不兼容。 SimpleMembership 需要SqlClient 提供者类型的连接字符串(即它没有元数据并且提供者类型是SqlClient

    其次,使用的连接字符串是在您的InitializeSimpleMembershipAttribute.cs 类中设置的,特别是调用WebSecurity.InitializeDatabaseConnection 的行。您可以将其更改为您想要的任何内容。 DefaultConnection 是 machine.config 中提供的默认连接字符串,默认情况下不会显示在您的 web.config 中。

    【讨论】:

    • 感谢您的回复。但是连接字符串对我来说一直是个谜。正如我所描述的,我尝试以多种方式编辑连接字符串。但我仍然没有得到工作所需的东西。 (另外,我知道DefaultConnection 连接字符串不会自动显示。这就是我添加它的原因。)
    • @JonathanWood - 你误会了。 Web.config 文件是分层的,machine.config 位于最底部,它包含 DefaultConnection。如果您想将连接字符串命名为“DefaultConnection”但不想使用 machine.config 中定义的 DefaultConnection,则只需覆盖此设置。如果您不想将连接字符串命名为 DefaultConnection,则需要在 InitializeSimpleMembershipAttribute.cs 中的 InitializeDatabaseConnection 调用中更改连接字符串名称。
    • @JonathanWood - EntityClient 连接字符串包含指向您的 .edmx 文件的元数据,SqlClient 连接字符串不包含该信息。 SimpleMembershipProvider 不理解 EntityClient 连接字符串,因此您不能使用与 SimpleMembership 的 EntityFramework 类相同的连接字符串。如果这对你来说是一个“谜”,你应该做一些研究,因为这是一个需要理解的重要区别,而不是你可以继续无知的东西。
    • 谢谢,但连接字符串的名称不是我遇到问题的地方。每做一次编辑,我都会得到一个不同的例外。但我似乎在进步。我想了解这一点,但似乎缺乏好的信息。使用 SimpleMembership 的信息非常可悲。
    【解决方案2】:

    您的 web.config 文件中有这些部分吗?

    <roleManager enabled="true" defaultProvider="simple">
      <providers>
        <clear/>
        <add name="simple" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
      </providers>
    </roleManager>
    <membership defaultProvider="simple">
      <providers>
        <clear/>
        <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
      </providers>
    </membership>
    

    【讨论】:

    • SimpleMembership 不使用任何成员的配置文件条目
    • 那么您是说应该从使用 SimpleMembership 的工作、代码优先、迁移、mvc 项目中删除这些部分?虽然,您对提供程序名称的权利需要是 System.Data.SqlClient
    • 我不知道您所说的“迁移”项目是什么意思,但 SimpleMembership 是通过 WebSecurity.InitializeDatabaseConnection 方法在代码中配置的,并且不为此使用任何配置文件。为了证明这一点,生成一个新的 Internet MVC4 应用程序,您会注意到配置中没有成员资格条目。
    • “迁移”是指使用 DbMigration 的开发项目。我向您表示感谢,SimpleMembership 是使用 InitializeDatabaseConnection 初始化的,它在 web.config 文件中创建部分。
    • 需要明确的是,InitializeDatabaseConnection 不会在 web.config 中创建任何内容,但它会在代码中动态初始化 Membership.Provider,因此不需要 web.config 条目(事实上,被 InitializedDatabaseConnection 方法覆盖)。您可以在此处阅读 WebSecurity 类的源代码aspnetwebstack.codeplex.com/SourceControl/latest#src/…
    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多