【问题标题】:How to add-migrations for auto-generated databases?如何为自动生成的数据库添加迁移?
【发布时间】: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


【解决方案1】:

您所有子数据库的DbContextSubDbContext。因此,您必须启用基于其中之一的迁移。然后把这段代码写成Configuration class:

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);

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2023-01-31
    • 2015-09-20
    • 2011-12-10
    • 2017-02-26
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多