【发布时间】:2017-11-13 05:37:13
【问题描述】:
我有一个包含 context 类的应用程序。一是主上下文类,二是子上下文类。当我第一次运行应用程序时,会生成主数据库。每当我创建一个新用户时,都会使用子上下文类生成与该用户相关的数据库。例如,如果我创建 10 个用户,那么将使用 sub_db_userId 这样的子上下文类生成 10 个数据库。
问题是在这种复杂结构中启用迁移。我知道有些人会说使用外键关系创建新数据库不合适,但我必须满足要求。
我发现this thread 非常有助于找到如何为单独的上下文类启用迁移,但在我的场景中,它不会将更改应用于现有数据库,因为数据库名称与用户 ID 相关联。而是将更改应用于现有的子数据库,它会创建没有用户 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 操作中将表链接到数据库,如下所示:
SubDbContext newContext = new SubDbContext(string.Format(userDatabase, "sub_db_" + userId));
newContext.Countries.FirstOrDefault();
newContext.Cities.FirstOrDefault();
【问题讨论】:
-
你知道所有可能存在的用户特定数据库吗?您的“主”数据库(不要与 sql-server 的主数据库混淆)?
-
抱歉没听明白?所有用户都存在于我的主数据库中。
标签: sql-server asp.net-mvc linq-to-entities dbcontext entity-framework-migrations