Entity Framework Core无法访问系统表 ef scaffold找不到CDC表如何解决
解决方案
问题原因
EF Core 3.1 的ef scaffold命令默认会自动过滤SQL Server标记为系统级的对象,CDC功能生成的变更追踪表默认归属cdc系统架构,即使修改表所有者、授予dbo权限也会被默认过滤逻辑排除,这是工具内置的筛选逻辑导致的,和权限配置无关。
可行操作步骤
- 第一步:给数据库账号授予
cdc架构的必要权限,执行以下SQL:
GRANT SELECT, VIEW DEFINITION ON SCHEMA :: cdc TO [你的数据库登录账号];
- 第二步:执行scaffold命令时必须显式指定要生成的CDC表的完整名称(含cdc前缀),仅指定
--schema cdc在EF Core 3.1版本中不会生效,命令示例如下:
dotnet ef dbcontext scaffold "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer --table cdc.你要生成的表名_CT --context 你的上下文名称 -o 实体输出目录
- 第三步(批量生成所有CDC表):如果需要生成全部CDC表的实体,可以先执行以下SQL查询拿到所有CDC表的完整名称:
SELECT 'cdc.' + name FROM sys.tables WHERE schema_id = SCHEMA_ID('cdc') AND name LIKE '%_CT'
把查询得到的所有表名依次追加到scaffold命令中,每一个表名前加--table参数即可。
注意事项
- 生成的CDC实体默认不会包含主键定义,需要手动根据业务场景配置主键(通常可以用
__$start_lsn+__$operation+业务主键的组合),否则EF Core会把实体映射为只读视图。 - 如果升级到EF Core 5.0及以上版本,可以直接用
--schema cdc参数批量导入整个cdc架构下的所有表,无需单独指定每个表名。
内容的提问来源于stack exchange,提问作者JPassos
相关产品推荐
相关产品推荐

