我有一个包含?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
答案 0 :(得分:1)
您所有子数据库的DbContext
为SubDbContext
。因此,您必须基于其中一个启用迁移。然后将此代码作为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);
我希望你觉得它很有帮助。