.Net 核心 3.x 无键实体类型避免 table 创建

.Net core 3.x Keyless Entity Types avoid table creation

我需要在 entity framework 核心 3.1.1 中执行一个复杂的 sql 查询,在研究中我发现无键实体类型是采用代码优先方法的方式。我看到很多关于 dbquery 的文档,但这在 .net 核心中被标记为过时 3.x

keyless entity types

根据 Microsoft 文档,它说 dbquery 已过时,因此请改用 dbset 方法,但使用 dbset 时,它会尝试在数据库中创建一个新的 table。如何在应用迁移时禁用 table 无键实体类型的生成?

示例代码

public class ApplicationContext : DbContext
{
 public DbSet<CustomQuery> CustomQuery { get; set; }
 protected override void OnModelCreating(ModelBuilder modelBuilder)
 {
    modelBuilder.Ignore<CustomQuery>();
    modelBuilder.Entity<CustomQuery>().HasNoKey();
 }
}

使用 .net 核心 2.2

var entity = _context.Query<CustomQuery>().FromSqlRaw(Regex.Unescape(selectQuery)).AsNoTracking().FirstOrDefault();

使用 .net 核心 3.1

var newEntity = _context.CustomQuery.FromSqlRaw(Regex.Unescape(selectQuery)).AsNoTracking().FirstOrDefault();

如果我尝试应用迁移,则会以自定义查询的名称创建一个新的 table,但我不需要这种情况发生。因为这只是一个用于保存连接查询值的模型,我不会插入、更新或删除此 table 中的值。如何实现?

或者对于这种情况有没有更好的方法。

这是 EF Core 3 中的一个已知缺陷,已在此处报告 3.0 Upgrade - Entity with HasNoKey() (formerly a query type) tries to create tables when adding migration #18116

作为 To vs From methods: Proposal to rationalize ToTable, ToQuery, ToView, FromSql, and other related methods #17270 and Ability to exclude/skip/ignore parts of the model from migrations so that a table is not created (for overlapping bounded contexts) #2725 的 "duplicate" 关闭,两者都计划在 5.0 版本中发布,这意味着它最终会在该版本中得到解决。

其中一位 EF Core 团队成员在 comments 中提到了当前的解决方法:

For now, you can just use something like .ToView("You forgot to use FromSql with ModQueueEntry")

或更一般地,使用.ToView(null),例如

modelBuilder.Entity<CustomQuery>().HasNoKey().ToView(null);