You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6中如何通过DBContext调用自定义存储过程?

问题描述

我有如下存储过程:

create procedure student.encrypt 
@text varchar(100)
@format varchar(100)
AS
BEGIN
select student.EncrptString(@plainText,@Format)
END
Go

该存储过程调用自定义函数student.EncrptString,在SQL Studio中运行正常,返回无列名的字符串。我尝试用以下代码在.NET 6中通过DBContext调用它,但未得到结果:

var y = _DBContext.EncryptString.FromSQLInterpolated($"exec student.encrypt {0},{1}",plaintext,format).SelectFirstorDefault();

其中EncryptString是我手动创建的模型类,代码如下:

// EncryptString.cs
public string format{get;set;}
public string plaintext{get;set;}
public string encrptedstring{get;set;}

请问该如何正确调用此存储过程?

解决方案

1. 修正存储过程的参数与返回列

存储过程存在两处问题:参数名不匹配、返回结果无列名,先修正存储过程:

create procedure student.encrypt 
@plainText varchar(100), -- 与函数调用的参数名统一
@format varchar(100)
AS
BEGIN
    -- 给返回结果指定列名,匹配模型类的encrptedstring属性
    select student.EncrptString(@plainText, @Format) as encrptedstring
END
Go

2. 调整EF Core的调用代码

修正FromSQLInterpolated的参数传递方式,同时修正方法拼写错误(原代码SelectFirstorDefault应为FirstOrDefault):

var encryptedResult = _DBContext.EncryptString
    .FromSQLInterpolated($"exec student.encrypt @plainText={plaintext}, @format={format}")
    .FirstOrDefault();

// 后续可通过encryptedResult?.encrptedstring获取加密后的字符串

3. 配置无键实体映射

由于EncryptString不是数据库中的实际表,需要在DBContext的OnModelCreating方法中配置为无键实体:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<EncryptString>().HasNoKey();
}

4. 更简洁的调用方式(可选)

如果仅需获取加密后的字符串,无需定义模型类,可直接使用ExecuteScalarAsync获取单个值:

var encryptedString = await _DBContext.Database
    .ExecuteScalarAsync<string>(
        $"exec student.encrypt @plainText={plaintext}, @format={format}"
    );

内容的提问来源于stack exchange,提问作者Navy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:22:21