Код инфраструктуры Entity сначала переносит на несколько баз данных

code-first code-first-migrations ef-code-first entity-framework entity-framework-6

Вопрос

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

Принятый ответ

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

Популярные ответы

В дополнение к вашему превосходному ответу вы можете использовать внешний файл конфигурации (например, «clients.json») вместо жесткого кодирования, поместить всю информацию о базе данных в пары ключ-значение в 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);

Работает как прелесть для меня :)




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему