.Net core 3.x Keyless Entity Types 避免表创建

Ric*_*oth 11 c# entity-framework-core ef-core-3.0 ef-core-3.1

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

无键实体类型

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

示例代码

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

使用 .net 核心 2.2

var entity = _context.Query<CustomQuery>().FromSqlRaw(Regex.Unescape(selectQuery)).AsNoTracking().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

使用 .net 核心 3.1

var newEntity = _context.CustomQuery.FromSqlRaw(Regex.Unescape(selectQuery)).AsNoTracking().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

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

或者有没有更好的方法来解决这种情况。

Iva*_*oev 14

这是 EF Core 3 中的一个已知缺陷,在此处报告3.0 升级 - 带有 HasNoKey()(以前的查询类型)的实体在添加迁移时尝试创建表 #18116

作为To 与 From 方法的“重复”关闭:建议对 ToTable、ToQuery、ToView、FromSql 和其他相关方法进行合理化 #17270能够从迁移中排除/跳过/忽略模型的一部分,以便不创建表(对于重叠的有界上下文)#2725,两者都计划在 5.0 版本中发布,这意味着它最终会在该版本中得到解决。

EF Core 团队成员之一在评论中提到了当前的解决方法:

现在,你可以使用类似的东西 .ToView("You forgot to use FromSql with ModQueueEntry")

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

modelBuilder.Entity<CustomQuery>().HasNoKey().ToView(null);
Run Code Online (Sandbox Code Playgroud)