通过ExecuteSqlRaw调用存储过程时Postman返回空参数的问题排查
问题排查与修复方案
1. Postman请求字段与实体类字段不匹配
你Postman里传的是Category_Code、Category_Name带下划线的key,从返回的响应体字段名(小驼峰categoryCode、categoryName)可以判断,你的Category实体类属性是无下划线的驼峰命名,参数绑定时找不到对应字段,所以接口拿到的category实体除默认值外全为null。
修复:将Postman请求体改成和实体类属性名匹配的格式:
{ "categoryCode":"130", "categoryName":"Kids" }
如果实体类属性是大驼峰CategoryCode、CategoryName,对应传大驼峰的key即可。
2. 存储过程逻辑错误
存储过程插入数据时用newid()生成了新的Category_Id,但最后查询的是传入的参数@Category_Id,你传入的category.CategoryId本身就是默认空Guid(全0),新插入数据的Id是随机生成的,所以这条查询永远查不到刚插入的数据。
修复:修改存储过程,把生成的新Id存到变量后再查询返回:
ALTER PROCEDURE [dbo].[CatinsertSP] @Category_Code nvarchar(20), @Category_Name nvarchar(167), @About_Category nvarchar(max), @Parent_Category_Id uniqueidentifier, @Is_Enable bit, @Is_Active bit, @Is_Block bit AS BEGIN SET NOCOUNT ON; -- 声明变量存储新生成的主键Id DECLARE @NewCategoryId uniqueidentifier = NEWID() insert into [dbo].[Category] (Category_Id,Category_Code,Category_Name,About_Category,Parent_Category_Id,Is_Enable,Is_Active,Is_Block) values(@NewCategoryId,@Category_Code,@Category_Name,@About_Category,@Parent_Category_Id,@Is_Enable,@Is_Active,@Is_Block) -- 查询刚插入的完整数据 select * from Category where Category_Id=@NewCategoryId END Go
同时删掉存储过程中无用的@Category_Id输入参数。
3. Service层调用方法错误
ExecuteSqlRaw()只会返回受影响的行数,不会读取存储过程返回的查询结果,你现在直接返回的是前端传进来的category对象,没有拿到数据库插入后返回的完整数据。
修复:用
FromSqlRaw读取存储过程返回的结果,修改Service层代码:
public Category AddCategory(Category category) { // 存储过程已删掉第一个@Category_Id参数,对应调整参数顺序 var insertedCategory = db.Categories.FromSqlRaw("[dbo].[CatinsertSP] {0},{1},{2},{3},{4},{5},{6}", category.CategoryCode, category.CategoryName, category.AboutCategory, category.ParentCategoryId, category.IsEnable, category.IsActive, category.IsBlock) .AsEnumerable() .FirstOrDefault(); return insertedCategory ?? category; }
如果你的DbContext中没有DbSet<Category> Categories的定义,需要先补充该配置。
内容的提问来源于stack exchange,提问作者Cse Engineer
相关产品推荐
相关产品推荐

