没有DbSet的实体框架核心存储过程

时间:2017-08-15 17:37:14

标签: entity-framework entity-framework-core

我按照https://docs.microsoft.com/en-us/ef/core/querying/raw-sql

的建议,从EF Core 1.1调用存储过程

但我创建了一个专门的类,它匹配从存储过程返回的数据的形状

List<MyStoredProcResultType> results = context.MyStoredProcResultType
    .FromSql("EXECUTE dbo.MyStoredProc {0}", someParam)
    .ToList();

但这意味着我必须在DbSet中为MyStoredProcResultType创建一个Context,现在对此进行编码是合法的

context.MyStoredProcResultType.Where(..)

但当然这不起作用。

有没有办法针对Context而不是DbSet调用存储过程并将结果放入我创建的类型中?

3 个答案:

答案 0 :(得分:3)

目前,在EF Core 2.0 RTM版本中,FromSql只能与模型中定义为EntityType的类型一起使用。限制是因为,EF Core具有关于EntityType的元数据并且知道如何实现它们。因此,对于任何其他类型(如自定义DTO /结果类型),FromSql不起作用。

这是EF Core GitHub存储库中的tracking issue,它正在准确地跟踪您要查找的内容。

EF Core 2.1.0计划为查询视图添加一些支持。 Tracking issue。如果你可以让EF Core知道你想在模型构建过程中使用的自定义类型,那么可以启用像你这样的场景。它不会映射为EntityType / Table,但EF Core仍会围绕它计算元数据以支持上述查询。

答案 1 :(得分:3)

从EF Core 2.1开始,您可以使用Query Types

您必须通过以下方式将结果类注册为查询类型:

modelBuilder.Query<MyStoredProcResultType>();

然后,只需使用:

var results = Context.Query<MyStoredProcResultType>()
                     .FromSql("EXECUTE dbo.MyStoredProc {0}", someParam)
                     .ToList()

有关此答案的信息,请转至@Ivan Stoev:https://stackoverflow.com/a/52003734/8358565

答案 2 :(得分:1)

我陷入了同样的问题,当使用带有返回嵌套对象的存储过程的Entity Framework Core时,必须将DTO添加为DbSet。经过研究,我发现了以下软件包:

https://github.com/verdie-g/StoredProcedureEFCore

https://github.com/snickler/EFCore-FluentStoredProcedure

请感谢软件包作者。