Stored procedures 使用存储过程获取EF Core中的输出参数值,但不包含返回表数据
我有一个存储过程,该存储过程应按id返回登录:Stored procedures 使用存储过程获取EF Core中的输出参数值,但不包含返回表数据,stored-procedures,entity-framework-core,Stored Procedures,Entity Framework Core,我有一个存储过程,该存储过程应按id返回登录: CREATE PROCEDURE MyProcedure ( @id INT, @login NVARCHAR(50) OUTPUT ) AS BEGIN SELECT ID , Login FROM Users WHERE ID = @id END GO 在endpoint中,它可以与以下代码配合使用: var id
CREATE PROCEDURE MyProcedure
(
@id INT,
@login NVARCHAR(50) OUTPUT
)
AS
BEGIN
SELECT
ID
,
Login
FROM
Users
WHERE
ID = @id
END
GO
在endpoint中,它可以与以下代码配合使用:
var id = new SqlParameter
{
ParameterName = "id",
SqlDbType = SqlDbType.Int,
Value = 15,
};
var login = new SqlParameter
{
ParameterName = "login",
SqlDbType = SqlDbType.NVarChar,
Direction = ParameterDirection.Output,
Size = 50,
};
var query = $"EXEC MyProcedure @{id}, @{login} OUTPUT";
var result = _context.Set<User>()
.FromSqlRaw(query, id, login).ToList();
foreach (var item in result) Console.WriteLine(item.Login);
和财产:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasNoKey();
}
我收到一个错误所需的列“Login”在“FromSql”操作的结果中不存在。
那么,获得
登录名的正确方法是什么呢?解决此问题的简单方法是使用context.Database.ExecuteSqlInterpolated()
或context.Database.ExecuteSqlRaw()
而不是context.Set().FromSqlRaw()
:
下面是一个完全工作的示例控制台程序,演示了该方法:
使用System.Collections.Generic;
使用系统数据;
使用系统诊断;
使用Microsoft.Data.SqlClient;
使用Microsoft.EntityFrameworkCore;
使用Microsoft.Extensions.Logging;
命名空间IssueConsoleTemplate
{
公共类用户
{
public int UserId{get;set;}
公共字符串登录{get;set;}
}
公共类上下文:DbContext
{
公共数据库集用户{get;set;}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
选项生成器
.UseSqlServer(
@“数据源=。\MSSQL14;集成安全性=SSPI;初始目录=So63991939”)
.UseLoggerFactory(LoggerFactory.Create(b=>b
.AddConsole()
.AddFilter(level=>level>=LogLevel.Information)))
.EnableSensitiveDataLogging()
.EnableDetailedErrors();
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasData(
新用户{UserId=1,Login=“John”},
新用户{UserId=2,Login=“Jane”});
}
}
内部静态类程序
{
私有静态void Main()
{
使用var context=newcontext();
context.Database.EnsureDeleted();
context.Database.recreated();
var connection=context.Database.GetDbConnection();
connection.Open();
使用(var command=connection.CreateCommand())
{
command.CommandText=@“创建过程uspGetUsers(
@userCount INT输出
)作为
开始
挑选
用户ID,
登录
从…起
用户;
选择@userCount=@@ROWCOUNT;
结束;“;
command.ExecuteNonQuery();
}
var userCountParameter=newsqlparameter(“@myUserCountParam”,SqlDbType.Int){Direction=ParameterDirection.Output};
context.Database.ExecuteSqlInterpolated($“EXEC uspGetUsers@userCount={userCountParameter}OUTPUT”);
Assert((int)userCountParameter.Value==2);
}
}
}
您可以使用以下命令运行示例代码
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasNoKey();
}
SELECT
@id =
ID
,
@login =
Login