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

标签 c# entity-framework entity-framework-core ef-core-2.2

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

...在我的上下文中

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

获取数据的调用示例:

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

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

bldr.Ignore<MyProcsDbSet>();

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

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

有没有办法为过程返回获取 dbset 而不必永远抑制 ef core 创建表的需求? .NET Core EF 代码首先的能力似乎总是最大的缺点在于自定义对象及其创建和检索。

最佳答案

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

在 EF Core 2.x 中实现目标的唯一选择是将 SP 结果类映射为 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 中这样调用它们)默认情况下不会映射到表,或者会有一个特殊的流畅的 API 来告诉实体没有关联的表。这在 2.x 中会很有用——正如我在开头提到的,Ignore有不同的含义,所以有类似 HasNoTable() 的东西, 或 [Table(null)] , 或 .ToTable(null)显式抑制表生成会很好。

但它就是这样,所以要么使用查询类型,要么从生成的迁移中手动删除“表”和相关命令。

关于c# - 如果我忽略用于某个过程的 dbset,我将无法使用 EF Core 获取该过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57517620/

相关文章:

c# - "Unknown column in ' 字段列表 '"知道为什么我得到它吗?

entity-framework - 在 Azure 应用服务上自动运行 EF 迁移

entity-framework-core - EF Core 中的 IsNumeric

c# - Entity Framework Core - 插入单向父子关系

ef-code-first - 如何将 EF 核心脚手架到现有数据库?

c# - 使用 dapper 将数据插入数据库时​​发生错误 "Implicit conversion from data type sql_variant to datetime is not allowed"

c# - Word自动化打印输出: wait for its finished?

c# - HTTP 错误 500.32 - 将独立的 .Net Core 3.1 应用程序部署到 Azure 后,ANCM 无法加载 dll

c# - EntityFramework 数据库优先 - 类型映射 - 在 C# 中将 binary(8) 从 SQL 映射到 int

entity-framework - URL 和 SEO 中的实体属性