1

我有一个包含context类的应用程序。一个是主上下文类,第二个是子上下文类。当我第一次运行应用程序时,master数据库被生成。每当我创建一个新用户时,与该用户相关的数据库就会使用子上下文类生成。例如,如果我创建10个用户,则会使用子上下文类(如sub_db_userId)生成10个数据库。如何为自动生成的数据库添加迁移?

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

我发现this thread在寻找如何为单独的上下文类启用迁移方面非常有帮助,但在我的方案中,由于数据库名与用户标识符相关,因此它不会将更改应用到现有数据库。相反,将更改应用到现有的子数据库,它将创建新的数据库,而不需要像这样的用户标识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动作是这样的:

SubDbContext newContext = new SubDbContext(string.Format(userDatabase, "sub_db_" + userId)); 
newContext.Countries.FirstOrDefault(); 
newContext.Cities.FirstOrDefault(); 
+0

您是否知道可能存在的所有用户特定数据库你的“主”数据库(不要与sql-server的主数据库混淆)? –

+0

对不起,我没有得到你?所有用户都存在于我的主数据库中。 –

回答

1

DbContext为所有子数据库是SubDbContext。所以你必须启用基于其中之一的迁移。然后把这个代码Configuration类:

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

,并把这个代码到SubDbContext构造:

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

这意味着,当发现新的手动添加Migration每个数据库, 然后再尝试迁移它。

,你也可以使用这个approache太:

写这段代码在的Application_Start

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

initializeMigrations.InitializeDatabase(context); 

我希望你觉得它有用。