.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ı
相关产品推荐
相关产品推荐

