EF Core 3 的 DbQuery 相关功能的等效性

20

在ef core 2.2中,我使用了DbQuery将原始的SQL结果映射到对象,如下所示:

public partial class AppDbContext{
    public DbQuery<SimpleQueryModel> SimpleQM {get;set;}
}

然后

var result=_dbContext.SimpleQM.FromSql(sqlString,params);

这不会创建任何额外的表,而且运行良好。

在 EF Core 3.1 中,DbQuery 已经过时,并告诉我要使用无键 DbSet。

我已按以下方式进行配置:

public partial class AppDbContext{
    public DbSet<SimpleQueryModel> SimpleQM {get;set;}
}

并且在ModelCreating中

builder.Entity<SimpleQueryModel>().HasNoKey();

但这将在新的数据库迁移中创建一个新表,如果我告诉 ef 忽略此实体,即如下所示

builder.Entity<SimpleQueryModel>().HasNoKey().Ignore();

我无法使用_dbContext.SimpleQM.FromSqlRaw();,这会抛出异常并告知模型未包含在上下文中。 在EF Core 3.1中如何实现相同的功能?

1个回答

20

问题已解决! 只需使用此配置。

builder.Entity<SimpleQueryModel>().HasNoKey().ToView("view_name_that_doesnt_exist");

7
丑陋但可用。令人啼笑皆非的是,他们决定不以智能的方式支持这个功能。 - James Hancock
@JamesHancock,不一定丑陋,这是类似的方式(如果不是完全相同)来整理一个常规集合。这是根据https://github.com/dotnet/efcore/issues/14194 - 引用:“我们在2.1中引入了“查询类型”作为没有定义主键的类型。然而,越来越多的人认为这些应该只是没有定义主键的实体类型。这并不意味着它们会有不同的行为,只是它们将被表示为实体类型并被称为实体类型。” - Gerard Jaryczewski
顺便说一句,这与我们在数据库世界中处理视图的方式非常相似。视图本质上是集合,最终可以以相同的方式连接和计算,只是源定义有点不同。也许不仅仅是有点,但是..只是;-) - Gerard Jaryczewski
文档:https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#query-types-are-consolidated-with-entity-types - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接