如何使WebSecurity在update-database中使用指定的连接字符串?

时间:2013-08-22 14:54:34

标签: asp.net-mvc ef-code-first simplemembership

我已将SimpleMembership添加到我的MVC4应用程序中,该应用程序首先使用EF代码。

我想将几个用户添加到我的数据库中作为种子数据。当我第一次运行Update-Database时一切正常:我的用户和密码设置正确。

然而,当我尝试在我的alpha服务器(来自visual studio)上运行它时,它不会添加我的用户。

为此,我发出命令

update-database -ConnectionString "<my alpha connection string>"

架构将被更新,但种子方法在不添加任何数据的情况下运行。

经过一番挖掘后,我修改了种子方法:

if (!WebSecurity.Initialized)
    WebSecurity.InitializeDatabaseConnection("TestData", "UserProfile", "UserId", "UserName", true);

其中TestData是web.config文件中我的连接字符串的名称

为:

if (!WebSecurity.Initialized)
    WebSecurity.InitializeDatabaseConnection("<actualConnectionString>","System.Data.SqlClient", "UserProfile", "UserId", "UserName", true);

将数据添加到我的alpha数据库。

因此,当我发出Update-Database命令时,WebSecurity会忽略该连接字符串并尝试在本地执行此操作。

我缺少一个设置或选项吗?

编辑此种子设定在Configuration.cs种子方法中完成。

1 个答案:

答案 0 :(得分:0)

免责声明。可能会有一些事情绊倒你,所以掷骰子 ......

Update-Database设置要在迁移中使用的连接字符串(UpDown方法),但它不会影响您已“编译”到数据上下文中的任何连接字符串或者您要求初始化SimpleMembership。

因此,您可以使用配置文件指定连接字符串,以及appSettings条目,其中包含连接字符串的名称,以便在任何时候使用(很难在单词,跳到下面的解决方案,看看它在行动)。

然后为数据上下文配置ctor,并初始化SimpleMembership(我建议single helper class)来从WebConfigurationManager.AppSettings["connStringName"]读取连接字符串名称。

完成此操作后,在调用Update-Database之前,请更改所需连接字符串名称的appSettings条目。然后,您可以依靠Update-Database开关-StartupProjectName(以获取配置文件)和-ProjectName(以获取迁移和播种)来为您完成剩下的工作。

(此解决方案还与使用构建配置名称更改配置文件以部署到远程服务器的xml转换很好地结合,您可以在其中更改appsettings条目或连接字符串值。必须使用此功能,因为从解决方案资源管理器视图发布的发布配置文件也可以为您更改连接字符串值。)

详情

希望以下内容描述您的设置:

  • 您的播种是在configuration.cs中完成的,internal sealed class Configuration : DbMigrationsConfiguration<SomeDataContext>
  • 您的SomeDataContextpublic class SomeDataContext: DbContext
  • 您的SomeDataContext

    • 指定连接字符串名称的构造函数,或
    • 默认构造函数,用于查找与上下文类名称相同的连接字符串

Configuration.Seed使用DbContext的连接字符串,而不是您在Update-Database中指定的连接字符串。虽然后者用于迁移中的命令,但SomeDataContext将其连接字符串名称“编译到其中”,因此Update-Database在运行时无法更改。

此外,有可能:

  • 您的用户是通过WebSecurityMembership类方法添加的(因为您声明使用的是SimpleMembership)
  • SimpleMembership是使用Configuration.Seed从您的WebSecurity.InitializeDatabaseConnection方法初始化的(希望,当您有多个位置来初始化时,您kept it DRY using a single class to initialise以便更轻松地解决此问题)

您的WebSecurity.InitializeDatabaseConnection调用指定了连接字符串名称,该名称再次被编译到调用中,因此Update-Database无法更改它。

解决方案。

使用app / web.config指定连接字符串

一种可能的解决方案是通过web.config文件使您的连接字符串名称可配置。然后,您可以在调用update-database之前更改连接字符串。这具有与配置转换相关联的优势,因此您可以在部署到不同服务器时更改连接字符串和/或连接字符串的名称。

在您的配置文件中:

<connectionStrings>
  <add name="DefaultConnection" connectionString="..." providerName="System.Data.SqlClient" />
  <add name="AlphaServer" connectionString="..." providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
  <add key="connStringName" value="DefaultConnection" />
</appSettings>

此配置转换的示例:

<connectionStrings>
  <add name="DefaultConnection" xdt:Locator="Match(name)" xdt:Transform="Remove"/>
</connectionStrings>
<appSettings>
  <add key="connStringName" value="AlphaServer" xdt:Locator="Match(key)" xdt:Transform="Replace"/>
</appSettings>
数据上下文构造函数中的

public DefaultDataContext()
  : base(WebConfigurationManager.AppSettings["connStringName"]) { }

WebSecurity.InitializeDatabaseConnection

中的single调用

WebSecurity.InitializeDatabaseConnection(
  WebConfigurationManager.AppSettings["connStringName"]), ...

使用编译符号

您还可以使用编译符号(例如,在构建配置中定义ALPHA)在编译时更改连接字符串名称,但由于多种原因,它不如web.config appSettings条目更可取;主要是配置条目允许您将所有耦合信息保存在一个地方,因此是一个更好的解决方案。