1

Допустим, у нас есть модель архитектуры веб-приложения, где у нас есть 1 база данных на 1 учетную запись. Структура базы данных для этих учетных записей одинакова и отличается только данными с помощью. Как настроить миграцию в первой модели кода.Первичная миграция кода сущностей в несколько баз данных

+0

У вас разные ветви разветвления для разных учетных записей? –

+0

Нет, для них есть только одна ветвь релиза. – Vitach

ответ

5

Теперь у меня есть следующее решение. В основном методе или в 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; } 
} 
0

См. the page on automatic migrations during application startup.

Если вы используете этот метод для применения ваших миграций, вы можете использовать любую строку соединения (или любой другой метод, с помощью которого вы должны точно определить, к какой базе данных подключиться) и при подключении, миграция будет выполнена.

+0

Как сообщить инструменту миграции список баз данных, которые мне нужно обновить? Можете привести пример? – Vitach

+0

Если я буду вводить около 50 или 100 баз данных в строку строк подключения, как инструмент миграции будет знать, какой из них необходим для миграции? – Vitach

+0

Database.SetInitializer (новый MigrateDatabaseToLatestVersion ()); не работает, потому что он может обновлять только одну базу данных. – Vitach

0

В дополнение к вашему прекрасному ответу, вы можете использовать внешний файл конфигурации (то есть «clients.json») вместо их жесткого кодирования, поместить всю информацию о базе данных в пары ключ-значение в json f ile и загрузить его во время запуска.

Затем, итерации по парам ключ-значение, вы можете выполнить инициализацию.

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); 

Работает как очарование для м e :)