EF Core Update-Database在生产库创建Domain\Username schema而非dbo的问题
解决EF Core 2.0迁移时生产环境自动创建Domain\Username Schema的问题
这个问题我之前帮同事排查过类似情况,核心原因是EF Core默认会使用数据库连接用户的默认Schema:开发环境的LocalDb默认把dbo作为所有用户的默认Schema,但生产环境的SQL Server里,你的域用户(Domain\Username)的默认Schema被设置成了自身用户名,导致迁移时自动创建并使用这个Schema,进而让应用的运行账户没有访问权限。
下面是几个针对性的解决方案,按优先级排序:
1. 全局配置默认Schema为dbo(最推荐)
在你的DbContext的OnModelCreating方法里,添加全局默认Schema配置,强制所有实体都使用dbo:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 全局设置默认Schema为dbo modelBuilder.HasDefaultSchema("dbo"); // 其他实体配置代码... }
配置完成后,重新生成迁移(Add-Migration FixDefaultSchema),再在生产环境执行Update-Database,后续的表都会自动创建在dbo下,已创建的错误Schema下的表也会被迁移到dbo(只要迁移生成的脚本正确)。
2. 为单个实体指定Schema
如果有部分实体需要使用不同的Schema,也可以单独为每个实体指定:
modelBuilder.Entity<YourEntity>() .ToTable("YourEntityTableName", "dbo");
这种方式适合不需要全局统一Schema的场景,但维护起来比全局配置麻烦一些。
3. 修正执行迁移的用户默认Schema
如果不想修改代码,也可以在生产SQL Server里,把你执行迁移的域用户的默认Schema改成dbo:
- 打开SQL Server Management Studio,连接到生产库
- 找到你的域用户(在
安全性->登录名目录下) - 右键选择属性,在
用户映射标签页找到目标数据库,把默认Schema改成dbo - 保存后再执行
Update-Database,迁移就会使用dbo作为默认Schema了
4. 迁移已创建的错误Schema表
如果已经在生产环境创建了Domain\Username Schema的表,可以通过以下步骤修正:
- 手动把错误Schema下的表转移到
dbo:ALTER SCHEMA dbo TRANSFER [Domain\Username].TableName;(把TableName替换成实际表名) - 删除错误的Schema:
DROP SCHEMA [Domain\Username]; - 确保代码里已经配置了默认Schema为
dbo,再执行一次迁移确保后续不会再出现问题
另外要注意:生产环境执行迁移时,尽量使用和应用运行账户相同的域账户,或者拥有dbo权限的账户,避免因为权限差异导致的Schema问题。
内容的提问来源于stack exchange,提问作者Lightbringer
相关产品推荐
相关产品推荐

