如何使网络安全在更新数据库中使用指定的连接字符串



我已将SimpleMember添加到我的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 似乎忽略了该连接字符串,只是尝试在本地执行此操作。

我是否缺少某个设置或选项?

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

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

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

因此,可以使用配置文件指定连接字符串,以及包含连接字符串名称appSettings条目,以便随时使用(很难用语言解释,请跳到下面的解决方案以查看其实际效果(。

然后,为数据上下文配置 ctor 和初始化 SimpleMembership 的调用(为此,我建议使用单个帮助程序类(以从 WebConfigurationManager.AppSettings["connStringName"] 读取连接字符串名称。

完成此操作后,在调用Update-Database之前,请更改所需连接字符串名称的appSettings条目。然后,您可以依靠Update-Database交换机-StartupProjectName(获取配置文件(和-ProjectName(获取迁移和种子设定(为您完成其余的工作。

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

详情

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

  • 您的种子设定是在配置.cs中完成的,这是internal sealed class Configuration : DbMigrationsConfiguration<SomeDataContext>
  • 您的SomeDataContext是一种public class SomeDataContext: DbContext
  • 您的SomeDataContext

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

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

此外,有可能:

  • 您的用户是通过WebSecurityMembership类方法添加的(如您声明正在使用 SimpleMember(
  • SimpleMembership 是使用 WebSecurity.InitializeDatabaseConnection 从您的Configuration.Seed方法初始化的(希望,虽然您有多个地方可以初始化它,但您使用单个类对其进行初始化保持干燥,以便您解决此问题变得更加容易(

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

解决方案。

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

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

在您的配置文件中:

<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

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

使用编译符号

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

最新更新