.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
相关产品推荐
相关产品推荐

