假设我们有Web应用程序的体系结构模型,其中每个帐户有1个数据库。这些帐户的数据库结构相同,仅与in中的数据不同。如何在代码优先模型中配置迁移。
答案 0 :(得分:7)
现在我有下一个解决方案。 在main方法或global.asax中是这样的:
var migration_config = new Configuration();
migration_config.TargetDatabase = new DbConnectionInfo("BlogContext");
var migrator = new DbMigrator(migration_config);
migrator.Update();
migration_config.TargetDatabase = new DbConnectionInfo("BlogContextCopy");
migrator = new DbMigrator(migration_config);
migrator.Update();
例如在app_config文件中的连接字符串:
<connectionStrings>
<add name="BlogContext" providerName="System.Data.SqlClient" connectionString="Server=(localdb)\v11.0;Database=MigrationsDemo.BlogContext;Integrated Security=True;"/>
<add name="BlogContextCopy" providerName="System.Data.SqlClient" connectionString="Server=(localdb)\v11.0;Database=MigrationsDemo.BlogContextCopy;Integrated Security=True;"/>
</connectionStrings>
配置类和上下文:
internal sealed class Configuration : DbMigrationsConfiguration<MigrationsDemo.BlogContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
protected override void Seed(MigrationsDemo.BlogContext context) {
}
}
public class BlogContext : DbContext {
public BlogContext() {}
public BlogContext(string connection_name) : base(connection_name) {
}
public DbSet<Blog> Blogs { get; set; }
}
答案 1 :(得分:1)
除了出色的答案外,您还可以使用外部配置文件(即&#34; clients.json&#34;)而不是硬编码,将所有数据库信息以键值对的形式放入json文件中在启动期间加载它。
然后,通过迭代键值对,您可以进行初始化。
clients.json
:
{
"DatabaseA": "DatabaseAConnectionString",
"DatabaseB": "DatabaseBConnectionString",
"DatabaseC": "DatabaseCConnectionString",
...
}
提供处理迁移的方法:
public static void MigrateDatabases(IDictionary<string,string> databaseConfigs)
{
foreach (var db in databaseConfigs)
{
var config = new Configuration
{
TargetDatabase = new DbConnectionInfo(db.Value, "System.Data.SqlClient")
};
var migrator = new DbMigrator(config);
migrator.Update();
}
}
然后在启动期间(我使用OWIN,所以它在我的Startup.cs
中也可能是global.asax.cs
):
string json;
var path = HttpRuntime.AppDomainAppPath;
using (var reader = new StreamReader(path + @"Config\clients.json"))
{
json = reader.ReadToEnd();
}
var databases = JsonConvert.DeserializeObject<IDictionary<string, string>>(json);
MigrateDatabases(databases);
对我来说就像一个魅力:)
答案 2 :(得分:0)
请参阅the page on automatic migrations during application startup。
如果您使用此方法应用迁移,则可以使用任何连接字符串(或您拥有的任何方法来确定要连接到哪个数据库),并且在连接时,将执行迁移。