2013-08-20 4 views
7

최근에 Entity Framework 5로 전환했습니다. 이제 기존 데이터베이스에서 POCO 클래스를 생성하고 지연로드와 변경 추적이 모두 필요합니다. 따라서 모든 스칼라 속성은 탐색 속성뿐 아니라 가상 속성이어야합니다.기존 데이터베이스에서 POCO 프록시를 생성하는 방법

새 ADO.Net 엔터티 데이터 모델을 추가하면 .edmx 파일과 다른 .cs 및 .tt 파일로 끝납니다.

기본적으로 생성 된 POCO 클래스가 기본적으로 변경 추적 프록시의 요구 사항을 충족하지 않는 이유가 궁금합니다. 즉 스칼라 속성은 가상이 아닙니다.

둘째, 프록시 사용 가능 poco 클래스를 어떻게 생성 할 수 있습니까?

추신 : 저는 Slauma의 대답을 지금까지 유일한 답변으로 받아 들였습니다. 그러나 나는 그 부분의 첫 부분에 동의하지 않습니다. 제한 및 성능 : 프록시 지원 단체에 대한 제한에 대해

  • : 여기

    Slauma 약 2 프록시 문제를 이야기 내 주장이다 클래스는 엔티티에 의해 DB 첫 번째 방법에서 발생하는 경우 프레임 워크에서 변경 추적 프록시를 활성화하기 위해 클래스가 따라야하는 규칙은 제한적이지 않기 때문에 그다지 중요하지 않습니다. 네비게이션 컬렉션이 IList 또는 HashSet인지 실제로 누가 신경 쓰나요? 제한 사항에 대해 말하면 응용 프로그램에서 perior 디자인 클래스가 있고 테이블을 생성해야만 합리적입니다.

  • 복잡한 속성은 DB에서 먼저 지원되지 않습니다. 따라서 우리는 토론에서 제외 할 수 있습니다.

  • 성능에 관하여 : the addressed article에서 내가 지금까지 연구 한 결과는 스냅 샷을 위해 프록시를 거부하도록 설득력을 얻지 못합니다. 첫째, 10,000 개의 a.k.a라는 많은 수의 엔티티에서 실험이 수행되었습니다. 응용 프로그램 (데이터베이스가 아닌)의 배치 프로세스가 많은 수의 엔티티에서 작동하는 것은 결코 쉬운 일이 아니지만 저장 프로 시저와 같은 더 나은 접근 방법을 가정합니다. 둘째, 응용 프로그램 유형 및 요구 사항에 따라 일반적으로 저장소 패턴이 적용되고 사용되는 경우와 같이 몇 가지 사례를 처리합니다. 프록시와 스냅 샷의 성능에는 차이가 없습니다. 흥미롭게도 해결 된 실험에서 속성에 동일한 값을 다시 할당하는 것이 프록시 성능이 크게 저하되는 유일한 경우였습니다. 그러나 누가 이것을 정말로합니까? 변경 추적기에 반복적으로 알려주지 않도록주의하는 것은 매우 쉽습니다. 이 경우에도 많은 수의 유언을 다룰 때 심각한 문제가 발생합니다. 기본적으로 생성 된 POCO 클래스 변경 내용 추적 프록시의 요구 사항, 가상 없습니다 즉 스칼라 속성을 충족하지 않는 이유

답변

4

첫째, 나는 궁금하다.

변경 내용 추적 프록시는 기본 변경 내용 추적 전략으로 사용하지 않는 것이 좋습니다. 자세한 내용은 this blog post에 설명되어 있습니다. 기본적으로 변경 추적 프록시를 사용하는 주된 이유는 스냅 샷 기반 변경 추적과 비교할 때 더 나은 성능을 보장하지 못하는 경우가 있습니다. 때로는 더 악화되기도하고 단점 목록이 스냅 샷 기반 변경 추적보다 길기 때문입니다.스칼라 속성을 포함하여 - -

는 과거에는 POCO 엔티티를 생성 한 T4 템플릿은 참으로 모든 속성 표시 virtual 등을 프록시 기반의 변경 추적을위한 개체를 준비했다. 블로그에 설명 된 이유 때문에 위에 링크 된 블로그 게시물 아래의 this comment에 언급 된 바와 같이 EF 5 용 DbContext 생성기를 포함한 최신 템플릿의 경우 변경되었습니다. 이제는 탐색 속성 만 virtual으로 표시되지만 지연로드가 가능하지만 변경 내용 추적 프록시에는 충분하지 않은 스칼라 속성이 표시되지 않습니다.

둘째, 어떻게 프록시 사용 가능 poco 클래스를 생성 할 수 있습니까?

나는 이런 짓을 했을까 가능한 T4 템플릿을 인식하지,하지만 virtual로도 스칼라 속성을 표시하는 기본 템플릿을 수정하는 것은 매우 간단합니다 : 당신의 프로젝트에서

  • 당신 확장자가 .tt 인 파일이 두 개 있어야합니다 (YourModelContainer.ttYourModelContainer.Context.tt). YourModelContainer.tt 파일을 엽니 다. 당신이 방법은 Property라는 찾을 수 있습니다이 파일에서

  • :와

    public string Property(EdmProperty edmProperty) 
    { 
        return string.Format(
         CultureInfo.InvariantCulture, 
         "{0} {1} {2} {{ {3}get; {4}set; }}", 
         Accessibility.ForProperty(edmProperty), 
         _typeMapper.GetTypeName(edmProperty.TypeUsage), 
         _code.Escape(edmProperty), 
         _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), 
         _code.SpaceAfter(Accessibility.ForSetter(edmProperty))); 
    } 
    

    변경 라인을 ...

     Accessibility.ForProperty(edmProperty), 
    

    ...에 ...

     AccessibilityAndVirtual(Accessibility.ForProperty(edmProperty)), 
    

그게 전부입니다.

당신이 그것에 익숙하지 않은 경우에 대비해서, 두 번째 종류의 Database-First 접근 방식이 있습니다 (Reverse Engineering an existing database to a Code-First model). 이 접근법은 T4 템플릿을 전혀 사용하지 않지만 코드 첫 번째 모델과 Fluent API 매핑이있는 컨텍스트를 만듭니다. 모델 클래스를 사용자 정의 및 확장 (나중에 수동으로 virtual 수식자를 추가 할 수 있음)하고 나중에 코드 - 첫 워크 플로우 (및 코드 1 마이 그 레이션)를 진행하여 데이터베이스 스키마를 업데이트 및 발전시키려는 경우에 유용합니다.

+0

답변 해 주셔서 감사합니다. 나는 당신의 대답의 첫 부분에 동의하지 않고 논쟁을 반영하기 위해 나의 질문을 업데이트했다. 그러나 두 번째 부분은 매우 유용했습니다. 나는 Code-First 모델을 알고 있지만 그것은 내 관심사가 아니다. – Alireza

+0

@ Alireza : 부분적으로 첫 번째 부분에 대한 평론가의 의견에 동의합니다. 나는 변화 추적 프록시 (http://stackoverflow.com/a/7112470/270591)의 팬이었고 그들은 나의 프로젝트 중 하나에서 생명의 은인이었다. 아서 빅커 (Arthur Vicker)의 기사가 발표 된 후 사용하기에 조금 더 조심스럽게되었습니다. 첫 번째 부분은 새로운 t4 템플릿이 POCO를 만들 때 왜 스칼라 속성에서'virtual' 수정자를 제거했는지 설명하기 위해 EF 팀의 견해를 인용 한 것일뿐입니다. – Slauma

+1

어쩌면 그들은 당신이 말한 것과 같이 추론했지만, 여전히 그들은 프록시를 다시 활성화하는 방법을 가르쳐 줄 수있었습니다. 이것은 마이크로 소프트에 의해 침묵으로 말미암아 프록시에 버그가 있다고 생각할 수 있습니다. – Alireza