2011-04-10 2 views
18

저는 Entity Framework 4를 사용하고 있습니다. 데이터베이스에서 첫 번째 모델을 사용하고 있습니다. 즉, 데이터베이스에서 EDM을 생성했습니다. 이제 모델 정의 함수를 추가하고 싶습니다. 내 질문은 ... 어디서?Entity Framework : CSDL/MSL은 어디에서 연장합니까?

.edmx 파일에 넣으면 다음 번에 데이터베이스를 업데이트하고 새 EDM을 생성 할 때 모든 추가 사항이 손상되지 않습니까? 내 말은 .Designer.cs 파일의 맨 위에 "코드를 다시 생성하면이 파일을 수동으로 덮어 쓰게됩니다."

그래서 어떤 파일에 추가 했습니까?

답변

33

모델 정의 함수가 잘 알려지지 않았기 때문에 나는 조금 깊이 생각할 것입니다.

EDMX 파일의 CSDL 부분에 모델 정의 함수를 수동으로 추가해야합니다. 파일을 XML로 열고 함수를 추가해야합니다.

<Function Name="FullName" ReturnType="Edm.String"> 
    <Parameter Name="emp" Type="TestModel.Employee" /> 
    <DefiningExpression> 
    Trim(emp.FirstName) + " " + Trim(emp.LastName) 
    </DefiningExpression> 
</Function> 

지금 당신은 당신의 EDMX을 저장하고 디자이너로 반환 할 수 있습니다 : 예를 들어이 모델 정의 함수는 직원의 전체 이름을 생성 할 수 있습니다. 이 함수는 여전히 존재하지만 모델 브라우저에는 표시되지 않습니다. 데이터베이스에서 모델을 업데이트하거나 모든 엔티티를 삭제할 수 있지만 기능은 계속 정의됩니다. EF는 EDMX의 CSDL 부분에서 사용자 지정 수정을 제거하지 않습니다.

이제이 모델 정의 함수를 사용할 수 있도록 .NET 함수를 정의해야합니다. 어디서나 할 수 있습니다. 한 가지 방법은 컨텍스트 부분 클래스를 사용하지만 같은 시간에 당신은 그냥 cutom 클래스를 사용할 수 있습니다 :

public static class EdmFunctions 
{ 
    [EdmFunction("TestModel", "FullName")] 
    public static string FullName(Employee e) 
    { 
     throw new NotSupportedException("This function is only for L2E query."); 
    } 
} 

을 그리고 당신이 완료됩니다. 유일하게 남은 작업은 Linq에 - 투 - 엔티티 쿼리의 기능을 사용하고 있습니다 :

using (var context = new TestEntities()) 
{ 
    var query = from e in context.Employees 
       select new 
        { 
         e.Id, 
         FullName = EdmFunctions.FullName(e) 
        }; 
    var data = query.ToList(); 
    ... 
} 

모델 정의 함수는 단지 그들이 단지 Linq에 - 투 - 엔티티 쿼리에서 사용할 수 있도록 SQL로 번역되어 일부 재사용 법인 SQL입니다 . 모델 정의 함수는 훨씬 더 복잡 할 수 있습니다.

+2

좋은 답변 - 모델을 업데이트 할 때 모델 정의 함수가 파손되지 않음 – BrokenGlass

+2

후속 조치로 [모델 : 개념 모델 (사용자 정의 함수)에서 사용자 지정 함수를 정의하는 방법]에 대한 MSDN 문서가 있습니다. Framework)] (http://msdn.microsoft.com/en-us/library/dd456812.aspx) –

+0

다른 질문에 대한 Joel Mueller의 대답은 언급 한 내용과 유사합니다. 매우 철저하며이를 만드는 방법도 보여줍니다. [LINQ to Entities] 메서드가 'Double Parse (System.String)'메서드를 인식하지 못하고이 메서드를 저장소 식으로 변환 할 수 없습니다. [1] [ 1] : http://stackoverflow.com/a/5971677/35133 –