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; }
问题分析与修正方案
原代码存在的问题
- 参数名不匹配:存储过程定义的参数是
@username,但创建的SqlParameter命名为user,导致参数无法正确绑定到存储过程。 - 返回类型不匹配:
db.Users.FromSql期望返回Users实体集合,但存储过程返回的是单个BIT类型值,类型不兼容,会引发错误。 - 错误的类型转换:直接将
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
相关产品推荐
相关产品推荐

