如果我忽略用于某个过程的 dbset,我将无法使用 EF Core 获取该过程

If I ignore a dbset used for a procedure I cannot use EF Core to get that procedure

我有一个运行良好的 EF Core 2.2 应用程序。然后我介绍程序,知道我可以做到这一点:

...在 myContext

public virtual DbSet<MyProcsDbSet> MyProcsDbSet{ get; set; }

获取数据的调用示例:

using(var context = myContext())
{
   var data = context.MyProcsDbSet.ExecuteSQL("Myproc @p0", 1);
}

应该注意这个工作正常。但是,当我去创建一个新的迁移时,它会生成一个 table。好吧,没什么大不了的,我只是在创建模型时声明不要构建那个 table。

bldr.Ignore<MyProcsDbSet>();

不,现在当我调用我正在运行的过程时,我得到了这个:

Cannot create a DbSet for 'MyProcsDbSet' because this type is not included in the model for the context.

有没有办法为过程 returns 获取数据库集,而不必永远抑制 ef 核心创建 tables 的需要? .NET Core EF 代码的能力首先似乎总是它最大的缺点是自定义对象及其创建和检索。

Ignore(或[NotMapped]属性)绝对不是用来抑制table生成的。它基本上是告诉 EF Core 不要将 class 及其属性视为模型的一部分,因此它不能用于 LINQ to Entities 查询和其他 EF Core 提供的服务。

在 EF Core 2.x 中实现目标的唯一选择是将 SP 结果 class 映射为 query type:

In addition to entity types, an EF Core model can contain query types, which can be used to carry out database queries against data that isn't mapped to entity types.

查询类型有一些限制,但同时默认情况下不会映射到数据库对象,因此非常适合与 FromSql.

一起使用

您只需将定义从 DbSet 更改为 DbQuery:

public virtual DbQuery<MyProcsDbSet> MyProcsDbSet{ get; set; } 

如果您的配置流畅,请确保使用 modelBuilder.Query<MyProcsDbSet> 而不是 modelBuilder.Entity<MyProcsDbSet>


在 EF Core 3.0 中,上述内容将发生变化,因为 Query types will be consolidated with entity types。所以基本上你必须使用 DbSet(和 modelBuilder.Entity)结合 HasNoKey 流利 API。现在说确切的行为是什么还为时过早,但我希望默认情况下 keyless 实体类型(他们在 3.0 中这样称呼它们)不会映射到 table , 或者会有一个特殊的流利 API 来告诉实体没有关联 table。这在 2.x 中会有用 - 正如我在开头提到的,Ignore 具有不同的含义,因此具有 HasNoTable()[Table(null)] 或 [=24] 之类的内容=] 显式抑制 table 生成会很好。

但事实就是如此,所以要么使用查询类型,要么从生成的迁移中手动删除 "table" 和相关命令。

在以前的版本中有 DbQuery 已弃用 EF Core >= 3.0

builder.Entity<MyProcsDbSet>.HasNoKey() 不排除创建 DbSet。

唯一的解决方案是修改生成的迁移

或添加 builder.Ignore<MyProcsDbSet>(); 并在生成迁移后对其进行注释。