如何为自动生成的数据库添加迁移?
问题描述:
我有一个包含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();
答
你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);
我希望你觉得它有用。
您是否知道可能存在的所有用户特定数据库你的“主”数据库(不要与sql-server的主数据库混淆)? –
对不起,我没有得到你?所有用户都存在于我的主数据库中。 –