如何在控制器中调用存储过程?DatabaseContext需补充哪些配置
需要补充的类与配置
当前你的代码缺失和存储过程返回结果匹配的实体定义,这是无法正常映射查询结果的核心问题,需要补充的内容包括:
- 新建与存储过程返回列完全匹配的
Employee实体类,类的属性名称、类型要和getEmployeeById存储过程返回的字段一一对应,比如员工ID属性要匹配数据库中id字段的nvarchar(7)类型,对应C#中的string类型。 - 在现有
DatabaseContext类中为Employee实体注册对应的DbSet,补充代码:public DbSet<Employee> Employees { get; set; } - 你现有的存储过程定义逻辑没有问题,不需要额外修改。
控制器中调用存储过程的实操方法
补充完上述配置后,直接在控制器的Action方法中通过DatabaseContext调用即可,必须使用参数化传递方式,禁止直接拼接用户输入到SQL语句中,避免SQL注入风险:
- 若使用EF Core版本,调用代码示例:
public IActionResult GetEmployee(string employeeId) { using (var dbContext = new DatabaseContext()) { // 定义与存储过程入参匹配的SQL参数 var idParameter = new SqlParameter("@employeeId", employeeId); // 执行存储过程,获取匹配的员工数据 var employee = dbContext.Employees .FromSqlRaw("EXEC getEmployeeById @employeeId", idParameter) .FirstOrDefault(); return View(employee); } } - 若使用EF6版本,将上述代码中的
FromSqlRaw替换为SqlQuery方法即可,整体调用逻辑完全一致。
额外说明
- 你现有代码中的
DbSet<Parameter> parameter属性和当前存储过程调用无关,如果不属于其他业务逻辑的必需内容,后续可根据实际业务场景清理。 - 如果不想为存储过程返回值新建强类型实体,也可以通过ADO.NET原生方式执行查询映射结果,但开发效率和可维护性会低于EF的强类型映射方式,通常不推荐。
内容的提问来源于stack exchange,提问作者Sothun Thay
相关产品推荐
相关产品推荐

