You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core 8.0.4数据库优先模式下如何排除视图Scaffolding?

EF Core 8.0.4反向工程时排除大量数据库视图的方案

方法1:批量生成--exclude参数(适合无统一命名规则的视图)

当视图数量极多无法手动逐个指定时,先从数据库导出所有视图名称,再批量传入排除参数:

  1. 执行SQL查询获取所有视图名称(以SQL Server为例):
SELECT name FROM sys.views;
  1. 将查询结果保存为文本文件(如views.txt),每行一个视图名称。
  2. 使用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的反向工程接口,全局排除所有视图:

  1. 创建自定义配置类:
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);
    }
}
  1. 在设计时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.Design NuGet包

内容的提问来源于stack exchange,提问作者Trần Nguyễn Trường

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:18:17