如何为自动生成的数据库添加迁移?

时间:2017-06-11 19:04:16

标签: sql-server asp.net-mvc linq-to-entities dbcontext ef-migrations

我有一个包含?convergence个类的应用程序。一个是主上下文类,第二个是子上下文类。当我第一次运行应用程序时,会生成master数据库。每当我创建一个新用户时,使用子上下文类生成与该用户相关的数据库。例如,如果我创建10个用户,那么将使用子上下文类(如context生成10个数据库。

问题是在这个复杂的结构中启用迁移。我知道有些人会说创建新数据库使用外键关系是不合适的,但我必须处理需求。

我发现this thread非常有助于找到如何为单独的上下文类启用迁移,但在我的方案中,由于数据库名称与用户ID相关联,因此它不会对现有数据库应用更改。而是将更改应用于现有子数据库,而不是像sub_db_userId那样创建没有用户ID的新数据库。我该如何解决这个问题?

下面给出了为每个用户创建新数据库的方式。

我的上下文类:

sub_db_

连接字符串:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false) {}
}

public class SubDbContext : DbContext
{
    public DbSet<Country> Countries { get; set; }
    public DbSet<City> Cities { get; set; }

    public SubDbContext() : base("SubDatabaseConnection")
    {
    }

    public SubDbContext(string connectionString) : base(connectionString)
    {
        Database.SetInitializer<SubDbContext>(new 
                           CreateDatabaseIfNotExists<SubDbContext>());
    }
}

我正在使用<add name="DefaultConnection" connectionString="Data Source=.\SQLExpress;Initial Catalog=master_db;Integrated Security=True" providerName="System.Data.SqlClient" /> <add name="SubDatabaseConnection" connectionString="Data Source=.\SQLExpress;Initial Catalog={0};Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> 进行格式化。如何启用迁移并将更改应用于现有数据库?

修改:我正在{0}行动中将表格链接到数据库:

Register

1 个答案:

答案 0 :(得分:1)

您所有子数据库的DbContextSubDbContext。因此,您必须基于其中一个启用迁移。然后将此代码作为Configuration类:

internal sealed class Configuration : DbMigrationsConfiguration<SubDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }
}

并将此代码放入SubDbContext构造函数中:

Database.SetInitializer<SubDbContext>(new MigrateDatabaseToLatestVersion<SubDbContext, Configuration>());
  

这意味着,每个数据库在找到新手册时都会添加Migration,   然后尝试迁移它。

你也可以使用这个方法:

将此代码写入 Application_Start

var context = new SubDbContext("your generated connection string");
var initializeMigrations = new MigrateDatabaseToLatestVersion<SubDbContext, Configuration>();

initializeMigrations.InitializeDatabase(context);

我希望你觉得它很有帮助。