我有一个EFCore2.2应用程序,运行良好。然后我介绍程序,并知道我可以这样做:
...In myContext
public virtual DbSet<MyProcsDbSet> MyProcsDbSet{ get; set; }
获取数据的示例调用:
using(var context = myContext())
{
var data = context.MyProcsDbSet.ExecuteSQL("Myproc @p0", 1);
}
这应该注意-这很好。但是,当我创建一个新的迁移时,它会生成一个表。好吧,没什么大不了的,我只会在On模型创建中声明,而不是构建那个表。
bldr.Ignore<MyProcsDbSet>();
不,现在当我打电话给我的程序时,我明白了:
无法为“MyProcsDbSet”创建MyProcsDbSet,因为该类型未包含在上下文的模型中。
是否有一种方法可以获得用于过程返回的dbset,而不必永远抑制ef核心的不足来创建表?,.NET core代码的能力首先似乎总是与自定义对象以及它们的创建和检索有关。
发布于 2019-08-16 02:23:08
Ignore
(或[NotMapped]
属性)绝对不是用来抑制表生成的。它基本上是告诉EF Core不要考虑类和它的属性作为模型的一部分,因此它不能用于LINQ实体查询和其他EF提供的服务。
在EFCore2.x中实现目标的唯一选择是将SP结果类映射为查询类型
除了实体类型之外,EF核心模型还可以包含查询类型,这些查询类型可用于对未映射到实体类型的数据执行数据库查询。
查询类型有一些限制,但在默认情况下没有映射到数据库对象,因此非常适合与FromSql
一起使用。
您所需要的只是将定义从DbSet
更改为DbQuery
public virtual DbQuery<MyProcsDbSet> MyProcsDbSet{ get; set; }
如果您有流畅的配置,请确保使用modelBuilder.Query<MyProcsDbSet>
而不是modelBuilder.Entity<MyProcsDbSet>
。
在EFCore3.0中,上面的内容会改变,因为查询类型将与实体类型合并。。因此,基本上您必须使用DbSet
(和modelBuilder.Entity
)和HasNoKey
fluent API相结合。现在说确切的行为还为时过早,但我认为默认情况下,无键实体类型(在3.0中称为它们)不会映射到表,或者会有一个特殊的fluent API来告诉实体没有关联的表。这在2.x中是有用的--正如我在一开始提到的,Ignore
有着不同的含义,所以使用类似HasNoTable()
、[Table(null)]
或.ToTable(null)
之类的东西来显式地抑制表生成是很好的。
但是它就是这样的,所以要么使用查询类型,要么手动从生成的迁移中删除"table“和相关命令。
发布于 2020-05-14 08:10:37
在以前的版本中,有DbQuery
,它被EF核心>= 3.0所反对
builder.Entity<MyProcsDbSet>.HasNoKey()
不排除创建DbSet。
唯一的解决方案是修改生成的迁移。
或者在迁移生成后添加builder.Ignore<MyProcsDbSet>();
并对其进行注释。
https://stackoverflow.com/questions/57517620
复制相似问题