实体框架代码首先迁移到多个数据库

时间:2014-01-03 16:06:22

标签: entity-framework ef-code-first code-first ef-migrations entity-framework-6

假设我们有Web应用程序的体系结构模型,其中每个帐户有1个数据库。这些帐户的数据库结构相同,仅与in中的数据不同。如何在代码优先模型中配置迁移。

3 个答案:

答案 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

如果您使用此方法应用迁移,则可以使用任何连接字符串(或您拥有的任何方法来确定要连接到哪个数据库),并且在连接时,将执行迁移。