如何从 .net core Entity Framework 调用带有表值参数的存储过程

7

我有一个带有表值参数的存储过程。 我需要在.NET Core中使用Entity Framework调用它。

我在context对象上找不到任何API。

我尝试使用ADO.net API,它可以工作,但现在我必须从EF在.NET Core中调用它。我要调用的存储过程返回结果,我必须捕获它。

我的样例SP如下所示

CREATE PROCEDURE [dbo].[GetMyData] 
@MyRequest [dbo].[MyRequestType] Readonly
As 
BEGIN

--Its sample SP thats why returned request table as it is    
select * from @MyRequest


END

MyRequestType 是用户定义的表类型。

其结构如下:

CREATE TYPE [dbo].[MyRequestType] AS TABLE(
    [Id] [numeric](22, 8) NULL,
    [Col1] [bigint] NULL,
    [Col2] [numeric](22, 8) NULL 
) 

我正在使用EF Core的Code first方法。

任何帮助将不胜感激。


如果我理解你的查询,我认为这篇文章可以帮助你:https://dev59.com/JGsz5IYBdhLWcg3wBzfi - Sanpas
https://dev59.com/JGsz5IYBdhLWcg3wBzfi#50339420 - Sanpas
执行存储过程与用户定义表的其他文章:https://www.codeproject.com/Tips/1033512/Executing-Stored-Procedure-with-User-Defined-Table - Sanpas
1
可能是Entity Framework存储过程表值参数的重复问题。 - Sanpas
2个回答

11

最终,我可以从使用EF core的.net core服务中调用表值参数存储过程的表值参数。

我已经创建了虚拟响应领域模型。

   public class MyResponse
    {
        public int Id { get; set; }
        public int Col1{ get; set; }
        public int Col2 { get; set; } 
    }

我把它称为“伪领域模型”,因为领域模型通常是CLR类中的表格表示,但在SQL Server中我没有这样的表格。

然后我在上下文类中添加了以下属性:

public class MyQueryDbContext : DbContext
{
  public virtual DbSet<MyResponse> Data { get; set; }
    .
    .
    .
}

然后需要为请求参数列表创建数据表,我已经添加了以下内容:

Then Need to create Data Table for Request parameter list, I have added like below

 DataTable table = new DataTable();
 table.Columns.Add("Id", typeof(int));
 table.Columns.Add("Col1", typeof(int));
 table.Columns.Add("Col2", typeof(int));

然后我从 .net core API 中使用 EF 调用了存储过程,并像以下方式传递了数据表作为参数

 var parameter = new SqlParameter("@MyRequest", SqlDbType.Structured);
 parameter.Value = table;
 parameter.TypeName = "[dbo].[MyRequestType]" // My Table valued user defined type
var response=_context.Data
                     .FromSql("EXEC [dbo].[GetMyData] @MyRequest", parameter)
                     .ToList()

你会在你的响应变量中得到响应。


1
我有一个问题,您如何防止迁移尝试每次修改数据库结构并调用 Add-Migration 时都创建表? - Jerome2606
根据您正在运行的EF版本,在OnModelCreating方法中添加modelBuilder.Entity<T>().HasNoKey().ToView(null);或在类上使用[Keyless]装饰器,以创建无键实体类型。详情请参阅:https://learn.microsoft.com/en-us/ef/core/modeling/keyless-entity-types?tabs=data-annotations - Subjective Reality

4

关于EF Core 3+的更新:

你可以使用FromSqlRawFromSqlInterpolated

var query = context.DnoFacts.FromSqlRaw("EXEC [dbo].[GetMyData] {0} ,{1}", otherParam, TableValueParameter)



var query = context.DnoFacts.FromSqlInterpolated($"EXEC [dbo].[GetMyData] {otherParam}, {TableValueParameter}")

EF Core 6:FromSqlInterpolated没有TableValueParameter的参数。 - Muflix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接