EF Core 8.0.4数据库优先模式下如何排除视图Scaffolding?
EF Core 8.0.4反向工程时排除大量数据库视图的方案
方法1:批量生成--exclude参数(适合无统一命名规则的视图)
当视图数量极多无法手动逐个指定时,先从数据库导出所有视图名称,再批量传入排除参数:
- 执行SQL查询获取所有视图名称(以SQL Server为例):
SELECT name FROM sys.views;
- 将查询结果保存为文本文件(如
views.txt),每行一个视图名称。 - 使用Package Manager Console执行脚手架命令:
Scaffold-DbContext "Your_Connection_String" Microsoft.EntityFrameworkCore.SqlServer -Exclude $(Get-Content views.txt)
或者用.NET CLI:
dotnet ef dbcontext scaffold "Your_Connection_String" Microsoft.EntityFrameworkCore.SqlServer --exclude $(cat views.txt)
方法2:自定义反向工程配置(灵活过滤)
通过实现EF Core的反向工程接口,全局排除所有视图:
- 创建自定义配置类:
using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Scaffolding; using Microsoft.EntityFrameworkCore.SqlServer.Scaffolding.Internal; public class ViewExcludingConfig : IReverseEngineeringConfigurationProvider { public ReverseEngineeringConfiguration GetConfiguration() { return new ReverseEngineeringConfiguration { DatabaseModelFactory = new ViewExcludingDbModelFactory() }; } } public class ViewExcludingDbModelFactory : SqlServerDatabaseModelFactory { protected override bool ShouldIncludeTable(string tableName, string schemaName) { // 直接排除所有视图,或者根据命名规则过滤 return !IsDatabaseView(tableName, schemaName); } private bool IsDatabaseView(string tableName, string schemaName) { // 这里可以通过查询数据库确认,或依赖命名规则(比如视图以v_开头) // 示例:匹配以v_开头的视图 return tableName.StartsWith("v_", StringComparison.OrdinalIgnoreCase); } }
- 在设计时DbContext工厂中指定该配置:
using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore; public class YourDbContextFactory : IDesignTimeDbContextFactory<YourDbContext> { public YourDbContext CreateDbContext(string[] args) { var options = new DbContextOptionsBuilder<YourDbContext>() .UseSqlServer("Your_Connection_String") .Options; return new YourDbContext(options); } public IReverseEngineeringConfigurationProvider GetReverseEngineeringConfigurationProvider() { return new ViewExcludingConfig(); } }
执行脚手架命令时,EF Core会自动过滤掉所有视图。
方法3:利用命名规则批量排除(如果视图有统一前缀)
若视图有统一命名前缀(如v_、view_),可通过脚本批量生成排除列表:
PowerShell示例:
# 查询所有符合前缀的视图 $views = Invoke-SqlCmd -Query "SELECT name FROM sys.views WHERE name LIKE 'v_%'" -ServerInstance "Your_Server" -Database "Your_Db" # 拼接成逗号分隔的排除字符串 $excludeList = $views.name -join "," # 执行脚手架命令 Scaffold-DbContext "Your_Connection_String" Microsoft.EntityFrameworkCore.SqlServer -Exclude $excludeList
注意事项
- 确保数据库连接账号有权限读取系统视图(如
sys.views) - 执行脚手架前备份现有代码,避免意外覆盖
- 若使用自定义配置类,需确保项目引用了
Microsoft.EntityFrameworkCore.DesignNuGet包
内容的提问来源于stack exchange,提问作者Trần Nguyễn Trường
相关产品推荐
相关产品推荐

