如何在Code First中配置Schema生成时指定dbo为授权用户?
问题解答
不能直接在你提供的Configure方法里配置Schema的授权——EF Core的EntityTypeBuilder.ToTable()方法仅用于指定表所属的Schema,并没有提供设置Schema所有者(授权者)的API。
要实现生成带AUTHORIZATION [dbo]的Schema创建语句,有两种常用方案:
方案1:手动修改迁移脚本
每次生成迁移后,找到自动生成的Schema创建代码,手动将:
IF SCHEMA_ID(N'Comun') IS NULL EXEC(N'CREATE SCHEMA [Comun];'); GO
替换为:
IF SCHEMA_ID(N'Comun') IS NULL EXEC(N'CREATE SCHEMA [Comun] AUTHORIZATION [dbo];'); GO
这种方式简单直接,适合小项目或迁移频率低的场景。
方案2:自定义迁移SQL生成器(自动生成授权语句)
通过自定义SqlServerMigrationsSqlGenerator,重写Schema创建语句的生成逻辑,让迁移自动带上授权配置:
- 创建自定义的SQL生成器类:
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations.Sql; using Microsoft.EntityFrameworkCore.Storage; public class CustomSqlServerMigrationsSqlGenerator : SqlServerMigrationsSqlGenerator { public CustomSqlServerMigrationsSqlGenerator( MigrationsSqlGeneratorDependencies dependencies, IMigrationsAnnotationProvider migrationsAnnotations) : base(dependencies, migrationsAnnotations) { } protected override void Generate(CreateSchemaOperation operation) { // 生成包含dbo授权的Schema创建语句 Sql($@"IF SCHEMA_ID(N'{operation.Name}') IS NULL EXEC(N'CREATE SCHEMA [{operation.Name}] AUTHORIZATION [dbo];');"); } }
- 在你的DbContext中注册这个自定义服务:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("你的数据库连接字符串") .ReplaceService<IMigrationsSqlGenerator, CustomSqlServerMigrationsSqlGenerator>(); }
之后再生成迁移时,Schema创建语句会自动包含AUTHORIZATION [dbo],无需手动修改。
内容的提问来源于stack exchange,提问作者Lou Damn
相关产品推荐
相关产品推荐

