Entity Framework多DbContext执行update-database未分别创建数据库问题
问题根因分析
- 核心原因是注册DbContext时的闭包捕获问题:代码中复用了同一个
connectionString变量存储两个连接串,EF注册时传入的lambda表达式作为闭包,捕获的是变量本身而非变量的即时值。当connectionString被重新赋值为BuildApp库的连接串后,两个上下文的配置委托最终执行时,都会读取变量最后存储的BuildApp库连接串,导致两个上下文实际都连接到EasyBuilderApp数据库。 - 次要可能原因:执行
Add-Migration时未按要求指定迁移名称,或未给不同上下文指定独立的迁移存储目录,导致EF工具识别上下文时出现异常,读取了错误的配置。
解决方案
- 首先修复闭包问题,注册时避免复用同一个变量存储连接串,两种修改方式二选一即可:
// 方式1:直接在UseSqlServer中读取连接串,不使用中间变量 services.AddDbContext<LicenseKeyDbContext>(options => options.UseSqlServer(_configuration.GetConnectionString("LicenseKeyDb"))); services.AddDbContext<BuildAppDbContext>(options => options.UseSqlServer(_configuration.GetConnectionString("BuildAppDb"))); // 方式2:使用两个独立的局部变量存储连接串 string licenseConn = _configuration.GetConnectionString("LicenseKeyDb"); services.AddDbContext<LicenseKeyDbContext>(options => options.UseSqlServer(licenseConn)); string buildAppConn = _configuration.GetConnectionString("BuildAppDb"); services.AddDbContext<BuildAppDbContext>(options => options.UseSqlServer(buildAppConn));
- 清空项目中之前生成的错误迁移文件,避免旧快照干扰后续执行。
- 规范执行迁移命令,补充迁移名称,同时为不同上下文指定独立的迁移输出目录:
# 处理BuildAppDbContext Add-Migration InitialBuildApp -Context BuildAppDbContext -OutputDir Migrations/BuildApp Update-Database -Context BuildAppDbContext # 处理LicenseKeyDbContext Add-Migration InitialLicense -Context LicenseKeyDbContext -OutputDir Migrations/License Update-Database -Context LicenseKeyDbContext
内容的提问来源于stack exchange,提问作者Cobysan
相关产品推荐
相关产品推荐

