【问题标题】:.Net core 3.x Keyless Entity Types avoid table creation.Net core 3.x Keyless Entity Types 避免创建表
【发布时间】:2020-05-21 09:58:18
【问题描述】:

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

keyless entity types

根据 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();
 }
}

使用 .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();

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

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

【问题讨论】:

  • 您的查询是动态的还是静态的?
  • 动态查询
  • 很遗憾,Ef Core 3.x 存在一些限制。我们有两个选项来映射我们的查询: 1 - 将查询结果映射到实体(每个表)。 2 - 在数据库中创建一个视图,然后将自定义对象映射到该视图。也许第二个选项更好地做到这一点,以便在不创建表的情况下映射您的自定义类型。
  • 非常感谢,也许现在我将与我们的团队进行内部讨论,并决定是继续使用过时的代码(不可接受)还是转而查看概念。

标签: c# entity-framework-core ef-core-3.0 ef-core-3.1


【解决方案1】:

这是 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 #17270Ability to exclude/skip/ignore parts of the model from migrations so that a table is not created (for overlapping bounded contexts) #2725 的“重复”关闭,都计划在 5.0 版本中发布,这意味着它最终将在该版本中得到解决。

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

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

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

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

【讨论】:

  • 我之前确实使用过 ToView,但我不知道这种黑客可以将 null 传递给它。有趣
  • 对我来说,使用 KeylessAttribute 解决了这个问题。
  • @0xBADF00D 是的,在 efcore 5.0 中引入了KeylessAttribute 之前的任何内容,我们必须使用答案中给出的.ToView(null)。请查看docs.microsoft.com/en-us/ef/core/modeling/…中的第一条注释
猜你喜欢
  • 2020-03-20
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
相关资源
最近更新 更多