免责声明。可能会有一些事情让你绊倒,所以掷骰子......
Update-Database 设置要在迁移(Up
和Down
方法)中使用的连接字符串,但它不会影响您“编译到”数据上下文或初始化 SimpleMembership 的任何连接字符串。
因此,您可以使用配置文件来指定连接字符串,以及一个appSettings
带有连接字符串名称的条目,以便在任何时候使用(难以用语言解释,请跳到下面的解决方案以查看它的实际效果)。
然后,您为数据上下文配置 ctor,并调用初始化 SimpleMembership(为此我推荐一个帮助程序类)以从WebConfigurationManager.AppSettings["connStringName"]
.
完成此操作后,在调用之前Update-Database
更改appSettings
您需要的连接字符串名称的条目。然后,您可以依靠Update-Database
开关-StartupProjectName
(获取配置文件)和-ProjectName
(获取迁移和播种)为您完成其余的工作。
(此解决方案还与使用构建配置名称更改配置文件以部署到远程服务器的 xml 转换很好地联系在一起,您可以在其中更改 appsettings 条目或连接字符串值。您不必使用它,因为从解决方案资源管理器视图发布用于发布的配置文件也可以为您更改连接字符串值。)
细节
希望以下内容描述您的设置:
- 您的播种是在 configuration.cs 中完成的,即
internal sealed class Configuration : DbMigrationsConfiguration<SomeDataContext>
- 你
SomeDataContext
是一个public class SomeDataContext: DbContext
你SomeDataContext
有
- 指定连接字符串名称的构造函数,或
- 默认构造函数,它查找与上下文类名称相同的连接字符串
Configuration.Seed
使用 DbContext 的连接字符串,而不是您在 Update-Database 中指定的连接字符串。虽然后者用于迁移中的命令, SomeDataContext
但它的连接字符串名称“已编译到其中”,因此 Update-Database 在运行时无法更改它。
此外,还有可能:
- 您的用户是通过
WebSecurity
andMembership
类方法添加的(正如您所说的,您正在使用 SimpleMembership)
- SimpleMembership 是从您的
Configuration.Seed
方法使用初始化的WebSecurity.InitializeDatabaseConnection
(希望,虽然您有多个地方来初始化它,但您使用单个类来保持它的 DRY 进行初始化,这样您对这个问题的解决方案变得更容易)
您的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
WebSecurity.InitializeDatabaseConnection(
WebConfigurationManager.AppSettings["connStringName"]), ...
使用编译符号
您还可以使用编译符号(例如在构建配置中定义 ALPHA)在编译时更改连接字符串名称,但由于多种原因,它不如 web.config appSettings 条目更可取;主要是配置条目让您将所有耦合信息保存在一个地方,因此是一个更好的解决方案。