EntityFramework를 사용하는 몇 가지 인수는 무엇입니까? [닫은] 저장 프로 시저와 수작업으로 만든

현재 빌드중인 응용 프로그램은 저장 프로 시저와 수작업으로 만든 클래스 모델을 사용하여 데이터베이스 개체를 나타냅니다. 일부 사람들은 Entity Framework 사용을 제안했으며 프로젝트에 그리 멀지 않기 때문에 Entity Framework로 전환하는 것을 고려하고 있습니다. 내 문제는 EF를 주장하는 사람들이 나에게 좋은 면만 알려주고 나쁜면은 아니라고 생각합니다. 🙂

나의 주요 관심사는 :

  • 우리는 DataAnnotations를 사용하여 클라이언트 측 유효성 검사를 원하며, 어쨌든 클라이언트 측 모델을 작성 해야하는 것처럼 들리므로 EF가 코딩 시간을 크게 절약 할 것이라고 확신하지 못합니다
  • 네트워크를 통과 할 때 클래스를 최대한 작게 유지하고 싶습니다. EF를 사용하면 필요하지 않은 추가 데이터가 포함되는 경우가 많습니다.
  • 여러 데이터베이스를 교차하는 복잡한 데이터베이스 계층이 있으며 EF가이를 처리 할 수 ​​있는지 잘 모르겠습니다. 우리는 사용자, 상태 코드, 유형 등과 같은 것들을 가진 하나의 공통 데이터베이스와 응용 프로그램의 다른 인스턴스에 대한 주 데이터베이스의 여러 인스턴스를 가지고 있습니다. SELECT 쿼리는 모든 데이터베이스 인스턴스에서 쿼리 할 수 ​​있으며 쿼리 할 수 ​​있지만 사용자는 현재 작업중인 데이터베이스에있는 개체 만 수정할 수 있습니다. 응용 프로그램을 다시로드하지 않고도 데이터베이스를 전환 할 수 있습니다.
  • 객체 모드는 매우 복잡하며 종종 몇 가지 조인이 관련됩니다.

EF의 주장은 다음과 같습니다.

  • 동시성. 저장하기 전에 레코드가 업데이트되었는지 확인하기 위해 코드를 작성할 필요가 없습니다.
  • 코드 생성. EF는 나를 위해 부분 클래스 모델과 POCO를 생성 할 수 있지만 유효성 검사 및 일부 사용자 정의 구문 분석 방법을 위해 클라이언트 측 모델을 작성해야한다고 생각하기 때문에 시간이 많이 절약됩니다.
  • 모든 데이터베이스 개체에 대해 CRUD 저장 프로 시저를 만들 필요가 없으므로 개발 속도

현재 아키텍처는 매개 변수가있는 저장 프로 시저를 통해 데이터베이스 호출을 처리하는 WPF 서비스, WCF 서비스 및 WPF 클라이언트를 오가는 POCO 개체 및 유효성 검사 및 POC를 위해 POCO를 클래스 모델로 변환하는 WPF 데스크톱 클라이언트 자체로 구성됩니다. 데이터 바인딩.

제 질문은 EF가 이것에 맞습니까? 내가 알지 못하는 EF에 대한 함정이 있습니까?



답변

나는 최근에 Entity Framework를 평가하고 있었고 문제와 누락 된 기능에 대해 찾은 가장 좋은 장소는 다음과 같습니다.
http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions

투표 수가 많은 항목 :

  1. 열거 형을 지원합니다. 이것은 꽤 크지 만 현재 몇 가지 해결 방법이 있습니다.
  2. 향상된 SQL 생성. 특히 엔터프라이즈 수준의 애플리케이션에서는 속도가 매우 중요하지만 EF4에서는 속도가 크게 향상되었습니다.
  3. 여러 데이터베이스를 지원합니다. 큰 응용 프로그램 요구 사항.

사용자 음성 목록에 더 많은 문제가 있습니다.

참고로, Code-First 접근 방식을 포함 할 곧 출시 될 EF 4.1 릴리스에 대해 매우 기쁘게 생각합니다 …
http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4 -1- 릴리즈 후보 -available.aspx

이것은 실제로 프로덕션 응용 프로그램에서 EF를 시도하도록 밀어 넣을 수 있습니다.


답변

EF로 버그 당 분기 / 기능을 수행하는 것은 병합시 매우 고통 스러울 수 있습니다. 두 개의 지점 A와 B가 데이터베이스를 변경한다고 상상해보십시오 (아마도 새 프로젝트의 초기 단계에서 많은 일이 일어날 것입니다).

모든 “일반”파일 (cs 파일 등)을 병합 한 다음 Model.edmx를 병합 할 차례입니다. 그리고 갑자기 객체 모델과 데이터베이스 간의 논리적 매핑뿐만 아니라 엔터티 다이어그램의 테이블 위치도 병합합니다.

Model.edmx를 병합하는 것은 너무 고통스럽기 때문에 우리는 상당히 불쾌한 방식을 채택했습니다.

  • 병합하는 동안 하나의 부모에서 모든 병합을 선택하십시오. 상관 없습니다. 어쨌든 파일을 곧 토스트 할 것입니다.
  • Model.edmx를 부모로 되돌립니다.
  • 데이터베이스를 새로운 병합 된 상태로 마이그레이션하십시오.
  • Model.edmx 및 “데이터베이스에서 모델 업데이트”를 엽니 다.
  • 병합 중에 토스트 된 모든 탐색 속성의 이름을 바꿉니다.

답변

EF에는 몇 가지 다른 이점이 있습니다.

  • 엔터티 스팬 테이블을 가질 수 있습니다
  • 테이블을 여러 유형의 엔티티로 분할 할 수 있습니다.
  • 데이터베이스에서 엔티티를 생성 할 수 있습니다 (예 : 마스터 접근 방식의 데이터베이스)
  • 엔터티에서 데이터베이스를 생성 할 수 있습니다 (예 : 마스터 접근 방식의 코드).
  • LINQ 쿼리는 SQL 쿼리로 변환되어 성능이 향상됩니다.

단점 (특히 유효성 검사를 사용하는 경우) :

  • 적절한 유효성 검사 특성으로 유효성을 검사하려는 속성이있는 다른 클래스를 가리키는 [MetadataClass] 특성을 만들어야합니다. 모든 속성은object 유형이므로 메타 데이터를 읽을 수 있습니다. 여전히 많은 추가 비활성 코드가 있습니다.
  • EntityFramework를 사용하는 것은 NHibernate (및 부모 Java 버전도)와 같은 것이 작동하도록 설계된 것과 다른 개념입니다. EntityFramework는 개체가 항상 라이브 연결을 사용 하는 연결된 모드에서 가장 좋습니다 . NHibernate 및 유사한 ORM 도구 는 데이터를로드 / 저장할 때만 연결이 사용되는 분리 모드에서 가장 잘 작동 합니다.

이것이 제가 가진 가장 큰 불만입니다. 여러 가지 이점이 있지만 NHibernate로부터 동일한 이점을 얻을 수있을 것입니다. EntityFramework가 테이블에 있으면 팀에서 NHibernate를 확인하고 귀하의 장단점을 신속하게 파악하도록 하십시오. 프로젝트.

메타 데이터 클래스 문제는 골치 아픈 일이지만 유감스럽게도 유효성 검사 태그가 필요한 엔티티가 너무 많습니다.

객체에 대한 진정한 분리 모드가 없으면 웹 환경에서 수행 할 수있는 작업이 제한됩니다. 연결 모드는 많은 Microsoft 혁신이 시작된 데스크톱 응용 프로그램에 적합합니다. 분리 모드가 가능 하지만 매우 고통 스럽습니다. 이 경우 대체 도구를 사용하는 것이 가장 좋습니다.


답변

마이크로 소프트가 잘 모르는 것 중 하나는 특히 새로운 기술과 관련하여 하위 호환성 비교 입니다.

특히 EF1 (.net 3.5)은 EF4 (.net 4.0)와 매우 다릅니다. 다음 버전에서도 동일하게 발생할 수 있습니다.

나는 잠시 기다렸다가 기술이 어떻게 성숙되는지 봅니다.

그 동안 nHibernate를 사용하는 것이 좋습니다. 이는 동등하지 않지만 성숙하고 활발하게 사용됩니다.


답변

  • 도메인 모델은 데이터베이스에있는 관계형 모델의 복제본이 아닙니다. 따라서 일부 테이블을 클래스에 매핑하고 와이어 위에 던지는 것은 단순한 게으름입니다. 데이터베이스가 3 개의 다른 테이블 인 경우에도 테이블이 로컬로 1 개의 오브젝트에 맵핑 될 수 있습니다. 데이터베이스를 지능적으로 설계하십시오.
  • 둘째,이 EF 물건은 특정 쿼리를 생성 할 수 없으므로 어쨌든 작성해야합니다.
  • 3 차 도메인 모델은 서비스에 직접 매핑되지 않습니다. 특히 모바일 앱과 통신하려는 경우 유선상에서 최소의 데이터 집합을 DTO로 푸시하려고 할 것입니다.
  • 5 번째 테스트 기능 … 코드 변경에 대해 충분한 회귀를 제공 할 정도로 세부적인 테스트를 만들 수 없습니다 … 모두 쉽게
    깰 수 있습니다 …

나는 10 페이지의 diatribe를 쓸 수 있습니다. 그러나 회사 X에 대한 일부 버림 응용 프로그램을 작성하는 경우 .. 누가 관심이 있습니까? 그러나 소프트웨어 제품을 개발하는 경우 훨씬 더 항문 적이어야합니다.


답변

이것을 확인하십시오 : http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/

주요 요점은 다음과 같습니다.

  • 게으른 로딩 부족
  • 지속성 무지의 부족
  • 엔터티 모델을 저장하는 데 사용되는 파일 형식에는 시각화 요소가 포함되어 있으며 엔터티 모델 자체로 인해 팀 환경에서 병합 문제가 발생합니다.

위의 링크는 EF1에 관한 것입니다.

또한 http://ormeter.net/ 링크 는 성능 및 LINQ 지원에서 다른 ORM에 비해 EF가 최고가 아님을 보여줍니다.


답변