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

.NET 6 EF Core 禁止EnsureCreated创建视图对应数据表

问题描述

生产环境新建数据库时,在分部DbContext类中定义了20个映射数据库视图的DbSet属性,相关代码如下:

public partial class DbModel
{
    public virtual DbSet<ViewType1> ViewType1{ get; set; }
    public virtual DbSet<ViewType2> ViewType2{ get; set; }
    // 其余视图DbSet...

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ViewType1>(_ =>
        {
            _.HasNoKey();
        });
        modelBuilder.Entity<ViewType2>(_ =>
        {
            _.HasNoKey();
        });
        // 其余视图实体的无键配置...
    }
}

调用Context.Database.EnsureCreated();方法创建数据库时,除常规业务表外,这些映射视图的实体也会被EF Core创建为普通数据表。需要实现的效果是:阻止EF在数据库中创建这些视图对应的表,这些实体仅作为项目内的代码查询模型使用。

解决方案

编辑补充:针对单个视图实体,使用如下配置即可解决问题

modelBuilder.Entity<VwAlacaklar>().ToTable(nameof(VwAlacaklar), t => t.ExcludeFromMigrations());

注意:HasNoKey()的作用仅为标记实体无主键,适配视图映射、原生SQL查询结果映射等无主键场景,不会阻止EF Core为该实体生成建表逻辑。
给视图实体追加ExcludeFromMigrations()配置后,EF Core在执行迁移、EnsureCreated()流程时都会跳过对应实体的表创建逻辑,完全满足仅将实体作为代码查询模型使用的需求。
如果需要配置的视图实体数量较多,无需逐个实体重复编写配置,可通过统一扫描规则批量处理,示例代码:

// 替换为项目中视图实体所在的命名空间,作为批量筛选的规则
var viewEntityNamespace = typeof(ViewType1).Namespace;
foreach (var entityType in modelBuilder.Model.GetEntityTypes()
    .Where(e => e.ClrType.Namespace == viewEntityNamespace))
{
    modelBuilder.Entity(entityType.ClrType)
        .ToTable(entityType.ClrType.Name, builder => builder.ExcludeFromMigrations());
}

内容的提问来源于stack exchange,提问作者Murat Saygılı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:39:18