我有一个运行良好的 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/