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

Entity Framework Core如何执行存储过程?验证用户名存在性求助

EF Core调用存储过程检查用户名存在性失败求助

需求说明

输入用户名不匹配则返回0并重定向错误页,匹配则返回1允许用户继续操作。已知SqlCommand实现方式,需要Entity Framework的正确写法。

现有代码

存储过程代码

ALTER PROCEDURE sp_login
    @username NVARCHAR(100)
AS
    DECLARE @Isvalid BIT
BEGIN
    SET @Isvalid = (SELECT COUNT(1) 
                    FROM Users 
                    WHERE Username = @username)
    SELECT @Isvalid
END

DbContext配置代码

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json");
    var configuration = builder.Build();
    optionsBuilder.UseSqlServer(configuration["ConnectionStrings:UserProfile"]);
}

尝试的控制器代码

public int LoginCheck(Users ad)
{
    if (ad.Username == null)
    {
        return 0;
    }

    var clientIdParameter = new SqlParameter("user", ad.Username);

    var result = db.Users.FromSql($"exec sp_login @username", clientIdParameter).ToList();
    int res = Convert.ToInt32(result);

    return res;
}

问题分析与修正方案

原代码存在的问题

  1. 参数名不匹配:存储过程定义的参数是@username,但创建的SqlParameter命名为user,导致参数无法正确绑定到存储过程。
  2. 返回类型不匹配:db.Users.FromSql期望返回Users实体集合,但存储过程返回的是单个BIT类型值,类型不兼容,会引发错误。
  3. 错误的类型转换:直接将List<Users>转换为int,不符合C#类型转换规则,会抛出异常。

正确的EF Core实现代码

方法一:使用FromSqlRaw获取单个返回值(适用于EF Core 3.1+)

public int LoginCheck(Users ad)
{
    if (string.IsNullOrEmpty(ad.Username))
    {
        return 0;
    }

    // 创建匹配存储过程的参数
    var usernameParam = new SqlParameter("@username", ad.Username);
    // 调用存储过程并获取返回的单个值
    var isValid = db.Set<int>().FromSqlRaw("exec sp_login @username", usernameParam).FirstOrDefault();
    
    // 存在则返回1,不存在返回0
    return isValid > 0 ? 1 : 0;
}

方法二:使用SqlQuery(适用于EF Core 7.0+,更简洁)

public int LoginCheck(Users ad)
{
    if (string.IsNullOrEmpty(ad.Username))
    {
        return 0;
    }

    var usernameParam = new SqlParameter("@username", ad.Username);
    var isValid = db.Database.SqlQuery<int>("exec sp_login @username", usernameParam).FirstOrDefault();
    
    return isValid > 0 ? 1 : 0;
}

额外简化方案

如果不需要依赖存储过程,直接用EF Core的LINQ查询也能实现相同效果,代码更简洁:

public int LoginCheck(Users ad)
{
    if (string.IsNullOrEmpty(ad.Username))
    {
        return 0;
    }

    var exists = db.Users.Any(u => u.Username == ad.Username);
    return exists ? 1 : 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:55:43