为什么Entity Framework仅在返回值被使用时才会执行存储过程调用
问题原因解答
1. 存储过程不执行的根因
Entity Framework 6 中的 SqlQuery<T>() 方法返回的是 DbRawSqlQuery<T> 类型,属于延迟执行的可枚举对象,和普通LINQ to Entities查询逻辑一致:仅定义查询本身不会触发任何数据库操作,只有当你主动枚举结果时,EF才会将命令发送到SQL Server执行。
你碰到的两种表现差异就是有没有触发枚举导致的:
- 调用
ToList()、First()、Count()或者用foreach遍历结果时,属于主动枚举操作,会立刻触发存储过程执行 - 只定义查询不做任何枚举操作,EF只会将其视为待执行的查询定义,不会真的发送请求到数据库
2. CartReturn类字段返回空的原因
EF做结果集到实体的映射时,默认只会映射公共属性,你定义的CartReturn中声明的是公共字段,没有get/set访问器,EF会直接跳过这些字段的赋值,调整为自动属性即可正常拿到返回值:
class CartReturn { public string CartNo { get; set; } public string Barcode { get; set; } public string Variation { get; set; } public string Qty { get; set; } }
3. 不需要返回值的最优写法
如果你完全不需要接收存储过程的返回结果,可以直接使用ExecuteSqlCommand()方法,这个方法是同步立刻执行的,不需要枚举结果,专门适配无结果集返回的SQL操作/存储过程调用:
db.Database.ExecuteSqlCommand("Scanning_Scan @Id, @SessionId, @Appname, @Barcode, @Username", _params);
该方法会直接返回存储过程影响的行数,不需要额外处理结果即可完成调用,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Ryan D.
相关产品推荐
相关产品推荐

