0

내 프로그램에 Entity Framework 4 엔터티 모델이 있습니다. 아무 데나 12.0.1 데이터베이스가 GuidToPrefix라고 내 SQL에서 정의한 저장 기능이있다 :Entity Framework 4의 저장 함수 사용 쿼리

<Function Name="GuidToPrefix" ReturnType="int" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="DBA"> 
    <Parameter Name="ID" Type="uniqueidentifier" Mode="In" /> 
</Function> 

것은이 될이 MSDN article의 지시에 따라

CREATE OR REPLACE FUNCTION GuidToPrefix(ID UNIQUEIDENTIFIER) RETURNS INT AS 
BEGIN 
    RETURN CAST(CAST(ID AS BINARY(4)) AS INT) 
END; 

, 나는 내 EDMX에 기능을 추가 솔직히 말해서 데이터베이스에서 모델을 업데이트하고 마법사의 첫 번째 탭에있는 목록에서 함수를 선택했는지 확인합니다. 차이가 있는지 없는지는 모르겠지만 그 이유는 알 수 없습니다.

이 기사에 따르면이 함수의 정의를 C# 클래스에 추가해야합니다. 내 문제는 그것이 어떤 수업에 들어갈 지 말해주지 않는다. 나는 완전히 새로운 수업을 추가 하는가? 새 .CS 파일을 만들고 다음과 같이 수행합니까 :

또는이를 엔티티 클래스의 일부로 지정합니까?

partial MyEntities { 

    [EdmFunction("CarSystemModel.Store", "GuidToPrefix")] 
    public static int GuidToPrefix(Guid id) { 
     throw new NotSupportedException("Direct calls to GuidToPrefix are not supported."); 
    } 
} 

이 엔티티 모델이 사용되는 두 개의 프로젝트가 있습니다. 하나는 클래스 라이브러리이고 모델은 그 안에 정의되어 있습니다. 다른 하나는 다른 솔루션의 또 다른 클래스 라이브러리로서이를 사용하고 있습니다. 나는 위의 두 예제를 시도하고 두 번째 클래스 라이브러리에서 쿼리는 두 경우 모두 컴파일러에서이 오류가 발생

The name 'GuidToPrefix' does not exist in the current context 

은 분명히 내가 바로 일을하고 있지 않다. 아무도 이것을 시도하고 작동하도록 했습니까?

+0

실제로 정적 메서드를 두는 것은 중요하지 않지만 데이터 계층의 일부임을 전달하기 위해 컨텍스트에 넣을 것입니다. –

+0

@GertArnold : 아니요. 이 예제는 혼란 스럽습니다. 최소한 예제 클래스에 넣는 것이 분명하지 않기 때문입니다. 그 개념이 내 머리를 통과하면, 그것은 간단했다. 그리고 저는 함수가 정적이어야한다는 것을 100 % 확신하지 못합니다. 컨텍스트의 인스턴스 메서드로 만들면 아마 작동 할 것입니다. 그러나, 나는 그것을 작동 시켰기 때문에, 나는 그것으로 놀지 않을 것이다. –

답변

0

이 답변을 찾았습니다. 내가 엔티티 모델이 정의되는 경우 내 프로젝트의 MyEntities 클래스의 부분으로 파일을 만든

리콜 :

partial MyEntities { 

    [EdmFunction("CarSystemModel.Store", "GuidToPrefix")] 
    public static int GuidToPrefix(Guid id) { 
     throw new NotSupportedException("Direct calls to GuidToPrefix are not supported."); 
    } 
} 

이 괜찮다고 그것은 모든 컴파일. 내 문제는 여기있는 것이 아니라 내가 그 기능을 사용해야하는 프로젝트에서였다. DataInterface라는 클래스에서, 나는이 같은 코드를 사용하는 방법이 해당 프로젝트에서

:

var query = from read in context.Reads 
      from entry in context.Entries 
           .Where(e => GuidToPrefix(read.ID) == e.PrefixID && read.ID == e.ID) 
       ..... 

문제는 그의는 C# 선언을 포함하는 클래스의 이름을 추가 할 필요가 있다고했다 GuidToPrefix 함수는 Where 절에 있습니다. 이 컴파일하고 실행하면 내가 원하는대로가 LEFT OUTER JOIN에서 데이터베이스의 함수를 사용

var query = from read in context.Reads 
      from entry in context.Entries 
           .Where(e => MyEntities.GuidToPrefix(read.ID) == e.PrefixID && read.ID == e.ID) 
       ..... 

: 즉, 나는대로 위의 식을 작성해야했습니다.