Stored Procedure return value in Entity Framework

Posted in .NET Framework // Posted at 2013. 5. 9. 18:50
728x90

Entity Framework 는 다 좋은데, 저장 프로시저의 return 값을 처리할 수 없다는게 단점이다.

 

물론 시각에 따라서 이것이 단점이냐 하는 것은 논란(?)의 소지가 있겠지만...

실제로, Entity Framework가 SQL을 대체하는 것이 아니라 ORM 프레임워크이기 때문에 SQL의 모든 기능을 지원하지 않는 것이 단점이라고 단정할 수 없다는 예기가... 인터넷 상에 존재한다.

 

하지만 개인적으로 참으로 아쉬운 부분이다.

이미 만들어진 저장 프로시저 들이 return value를 많이 사용하고 있는 상황에서,

모델 계층을 Entity Framework 로 마이그레이션 하려고 하니 더욱 아쉬운 생각이 든다.

 

특히 MS의 또 다른 기술인 LINQ TO SQL에서는 return value를 지원하기에, Entity Framework의 버전 업에 해당 기능이 추가 되기를 기대해 보지만 아직인 듯 하다.

 

그렇다고 Entity Framework를 도입하려고 기존에 잘 운영되고 있는 수 많은 저장 프로시저들을 select 혹은 ouput 변수로 수정한다는 것도 현실적이지 않다.

 

그렇다면 return value 처리를 위해서만 별도로 LINQ TO SQL 혹은 ADO.NET을 사용할 수도 있겠지만,

MODEL 계층의 기술 기반이 복잡해지고 이중화 된다는게 맘에 들지 않는다.

 

그럼. 마지막으로 사용할 수 있는 카드는,

어떤 식으로든 Entity Framework 상에서 저장 프로시저의 return value를 처리하기만 하면 된다.

 

다시 말하지만 '어떤 식으로든...' .

 

다음의 코드는 Entity Framework로 저장 프로시저의 return value를 반환받는 코드이다.

썩 맘에 들진 않지만, 불가피한 경우에 고민해 볼 만 하다.

 

-- 저장 프로시저

CREATE PROC [dbo].[USP_Test]
AS
BEGIN  
 return 5
END

 

//Entity Framework로 저장프로시저의 return value

var returnValueParam = new SqlParameter();
returnValueParam.ParameterName = "@returnValueParam";
returnValueParam.SqlDbType = SqlDbType.Int;
returnValueParam.Direction = ParameterDirection.Output;
var data = context.Database.SqlQuery<int>("EXEC @returnValueParam = [dbo].[USP_Test]", returnValueParam);

               

try
{
        data.SingleOrDefault();                   
}
catch { }

 

string returnValue = returnValueParam.Value.ToString();