2011-04-29 4 views
1

SQL Server 2005 데이터베이스에서 Entity Framework 모델을 생성하고 저장 프로 시저를 가져 오기 시작했습니다.저장 프로 시저 매개 변수 이름 및 Entity Framework

절차 또는 함수 'csp_getCoworker는'매개 변수 '@@ FIRSTNAME'제공되지 않았습니다 기대 : 나는 그것을 실행하려고하면 지금까지 너무 좋아하지만, 저장 프로 시저 중 하나 예외가 발생합니다. 여기

는 스토어드 프로 시저의 서명입니다 : 엔티티 프레임 워크에 의해 생성 된 코드 여기

ALTER PROCEDURE [dbo].[csp_getCoworker](
@@firstname nvarchar(32), 
@@lastname nvarchar(32), 
@@businessarea nvarchar(512), 
@@location nvarchar(512) 
) 

하고

ObjectParameter p_firstnameParameter; 
if (p_firstname != null) 
{ 
    p_firstnameParameter = new ObjectParameter("p_firstname", p_firstname); 
} 
    else 
{ 
    p_firstnameParameter = new ObjectParameter("p_firstname", typeof(global::System.String)); 
} 
[...] 
return base.ExecuteFunction<csp_getCoworker_Result2>("csp_getCoworker", p_firstnameParameter, p_lastnameParameter, p_businessareaParameter, p_locationParameter); 

이 어질러 매개 변수 이름에 더블 @의 -characters인가 사물?

답변

2

매우 드문 시나리오이므로이 테스트를 방금했습니다.

저장 프로시 저는 @@을 사용하지 않아야하므로 매우 이상한 명명 규칙을 따릅니다. 기본적으로 일부 SQL Server 시스템 변수에서 사용되므로 다른 용도로 사용하면 안됩니다. @x을 저장 프로 시저의 매개 변수로 사용하면 x 매개 변수를 정의하지만 을 사용하면 매개 변수 @x을 정의합니다. @는 매개 변수 이름의 일부입니다!

@는 예약 된 키워드와 같은 변수 이름을 정의하는 데 사용되는 이스케이프 문자이기 때문에 C#에서는 매우 큰 문제입니다. 예 :

string @string = "abc"; 

string이라는 변수를 정의합니다. 변수 이름은 @로 시작할 수 없습니다.

엔티티 프레임 워크는 모두 @_으로 바꾸고 매개 변수의 접두사를 p으로 직접 처리하여이 문제를 처리합니다. 그 이유는 SSDL 맵핑 된 저장 프로 시저에서 작성된 함수 가져 오기에는 프로 시저와 이름이 같은 매개 변수가 있어야하지만 동시에 @는 시작 문자로 허용되지 않기 때문입니다. 수동으로 EDMX를 수정하려고하면 @가 CSDL에 정의 된 식별자의 시작 문자로 허용되지 않으므로 자체 XSD 유효성 검사가 실패합니다.

심지어 이것은 CSDL에서 매개 변수의 이름을 변경할 가능성이없는 버그로 간주 될 수 있습니다. 이 순간에 이것은 설계 상으로는 SQL 스토어드 프로 시저의 매개 변수 이름을 수정하는 것입니다.

+0

위대한 답변이었습니다. 그것은 나에게 올바른 방향으로의 추진력을 주었고, 적절한 SP에 전달 된 변수로 올바르게 래퍼 프로 시저를 작성함으로써이 문제를 해결했습니다. –

+2

@Bartek : *해야 할 일은 매개 변수 이름에 이중 @ 표시를 사용하고, 얼굴을 때리고, 고쳐 주도록하는 것이 좋다고 생각한 사람을 찾는 것입니다. –

+0

@Matti : 나는 그것을 시도했지만 오래 동안 조직을 떠났습니다. > :( –

관련 문제