【问题标题】:Entity Framework Core Stored Proc without DbSet没有 DbSet 的实体框架核心存储过程
【发布时间】:2020-05-28 14:28:10
【问题描述】:

我按照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();

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

context.MyStoredProcResultType.Where(..)

但这当然行不通。

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

【问题讨论】:

标签: entity-framework entity-framework-core


【解决方案1】:

从 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

【讨论】:

  • 对于阅读此答案的任何人,从 .NET Core 3 开始有一种新方法可以做到这一点。正如 antoninod 所指出的,请阅读链接后@Ivan Stoev 的 SO 回答。
【解决方案2】:

目前,在 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 仍会围绕它计算元数据以支持上述查询。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,在将 Entity Framework Core 与返回嵌套对象的存储过程一起使用时,必须将 DTO 添加为 DbSet。经过一番研究,我发现了这些包:

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

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

    请感谢包作者。

    【讨论】:

      猜你喜欢
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 2019-01-30
      • 2018-05-19
      • 2017-10-29
      • 2021-04-08
      相关资源
      最近更新 更多