具有存储过程的实体框架,可以选择返回记录集
本文关键字:选择 返回 记录 存储过程 实体 框架 | 更新日期: 2023-09-27 18:37:19
我有一个存储的过程,它通常返回记录集,但在某些情况下它根本不返回记录集。这让 EF 有些悲伤:
"数据读取器与指定的'myDBContext.usp_MyProc_Result'不兼容。类型为'TheFirstColumn'的成员在数据读取器中没有具有相同名称的相应列。
有没有办法告诉它只是返回 null 或类似的东西,如果 proc 不返回任何内容
我只在处理包含事务的非常高并发的存储过程调用时看到过EF + MySQL的这个问题,但是一旦第一次发生,它就会发生数千倍,非常快。有趣的是,我在EF + SQLServer中从未遇到过此错误,并且我更频繁地使用它。
我做了一些事情来纠正这个问题:
数据库级
首先,您应该更新存储过程并实现一些异常处理。我知道OP说这对他来说是不可能的,但无论如何这应该是第一个追索权!这个例子在 mysql 中
CREATE PROCEDURE `YourProcedureName` (IN YourParameter YourType)
BEGIN
DECLARE STUFF;
-- Thanks to tips from http://khanrahim.wordpress.com/2010/05/16/transaction-with-stored-procedure-in-mysql-server/
-- and syntax from http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html
DECLARE EXIT HANDLER FOR SQLEXCEPTION SQLWARNING
BEGIN
ROLLBACK;
SELECT AnInstanceOfTheResultSet FROM YourTable WHERE 1 = 0; -- Force an empty result-set
END;
START TRANSACTION;
-- Do your complex operations
COMMIT;
END
代码内
其次,在代码中,使用引发的最具体的异常包装 EF 调用,即:实体命令执行异常。下面是 c# 中的一个示例
YourType result = null;
try
{
result = yourContext.YourProcedureName(YourParameter).FirstOrDefault();
}
catch (EntityCommandExecutionException ecee)
{
// Log it? Handle it somehow...
}
if (result == null)
{
// Handle your error state
}
// Continue processing normally...
祝你好运!
据我所知,EF 允许我们根据存储的返回值创建复杂类型。
你可以关注这篇文章
http://weblogs.asp.net/dotnetstories/archive/2011/03/01/using-stored-procedures-with-entity-framework-in-an-asp-net-application.aspx