ASP.NET MVC双本地数据库的迁移启用方案咨询
解答你的ASP.NET MVC多DbContext迁移问题
1. 能不能同时为两个数据库启用迁移?
当然可以!之前你执行Enable-Migrations -ContextTypeName IdentityTest.Models.TestDb时覆盖原有配置,是因为没有指定独立的迁移目录——默认情况下,所有迁移文件都会生成到根目录的Migrations文件夹里,新的配置会直接覆盖旧的。
正确的操作是为每个DbContext指定单独的迁移文件夹,执行命令时加上-MigrationsDirectory参数:
# 重新为Identity的DbContext创建独立迁移目录(如果之前的配置被覆盖了) Enable-Migrations -ContextTypeName ApplicationDbContext -MigrationsDirectory Migrations\IdentityMigrations # 为你的TestDb创建专属迁移文件夹 Enable-Migrations -ContextTypeName IdentityTest.Models.TestDb -MigrationsDirectory Migrations\TestDbMigrations
这样两个DbContext的迁移文件和Configuration类会分别存放在不同子文件夹里,互相不会干扰。之后执行数据库更新时,也要明确指定对应的Context:
# 更新Identity用户管理数据库 Update-Database -ContextTypeName ApplicationDbContext # 更新业务模型数据库 Update-Database -ContextTypeName IdentityTest.Models.TestDb
2. 是否需要共享同一个migrations/config.cs文件?
完全不需要,反而分开维护更合理。每个DbContext应该对应独立的迁移配置文件,这样你可以为不同数据库单独设置迁移规则(比如是否启用自动迁移、Seed方法的初始化逻辑)。
比如Identity的Configuration可以专注于初始化管理员用户,而TestDb的Configuration可以单独处理业务模型的测试数据,两者分开不会互相影响,也能避免因配置冲突导致的编译错误。
3. 如何把模型数据存储到第一个Identity数据库而非新建的TestDb?
如果不想维护两个数据库,最稳妥的方式是将业务模型合并到Identity的DbContext中,具体步骤如下:
- 打开你的Identity DbContext(通常是
ApplicationDbContext),把TestDb里的所有业务模型DbSet<T>添加进去:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { // Identity自带的用户相关DbSet // ... // 添加你的业务模型DbSet public DbSet<Product> Products { get; set; } public DbSet<Order> Orders { get; set; } }
- 删除原来的
TestDbContext类,确保所有业务代码都使用ApplicationDbContext操作数据。 - 打开Package Manager Console,执行迁移命令更新Identity数据库:
Add-Migration AddBusinessModels -ContextTypeName ApplicationDbContext Update-Database -ContextTypeName ApplicationDbContext
这样你的业务模型对应的表就会自动生成到Identity的数据库里,不需要再维护第二个TestDb了。
另外还有一种方式是让TestDbContext使用和Identity数据库相同的连接字符串,但这种方式容易出现迁移冲突,合并DbContext是更可靠的方案。
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

