我按照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
调用存储过程并将结果放入我创建的类型中?
答案 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
请感谢软件包作者。