EntityFramework를 사용하는 몇 가지 인수는 무엇입니까? [닫은]


31

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

나의 주요 관심사는 :

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

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

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

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

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


성능과 LINQ 지원 비교 : ormeter.net
M.Sameer

답변:


7

나는 최근에 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를 시도하도록 밀어 넣을 수 있습니다.


반대 주장 : 1st & 2nd & 3rd : 그것은 느립니다! 학습 곡선이 있습니다 (왼쪽 조인을 수행하는 방법을 알아야 함-다른 사람이 수행중인 작업을 알 수 있도록 방법을 찾는 데 3 시간이 걸립니다) .SQL 대신 LINQ에서 페이징 (예 : 페치) 10 개의 밀리언 행, 임의의 오프셋에서 20 개를 가져온 다음 왜 느린 지 궁금합니다.) Repo는 비 트레드 안전하므로 쿼리별로 초기화해야하며 리포 초기화는 다음과 같습니다. 더 큰 데이터베이스가있는 경우 (매우 느리게 (100 초와 같지 않음) 100-200 개의 테이블이있는 경우) 매우 느림 (예 : 5 초)
Quandary

2
@Quandary LINQ 표현식이 완전히 정의되기 전에 IQueryables를 실행하는 것처럼 보입니다 (예 : .ToList()또는 .ToArray). 그것이 모든 레코드를 가져 와서 느리게 만드는 이유입니다.
orad

6

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

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

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

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

1
이 비판은 EF Code First에는 유효하지 않지만 Model First 및 Database First에는 적용됩니다.
Alan Macdonald 2013 년

Fluent를 사용하여 모든 매핑을 직접 만들고 매핑을 완전히 제어합니다. 이들은 별도의 .cs 파일 안에 있습니다.
Steven Ryssaert

5

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

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

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

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

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

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

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


귀하의 소위 마스터와 같은 코드 방식입니다 공식적으로 불리는 첫 번째 코드를
로버트 Koritnik

1
@Berin, "첨부 모드"의 의미를 명확히하고 싶습니다. Entity Framework가 항상 열린 데이터베이스에 연결되어 있다고 생각하지 않습니다. EF는 이와 관련하여 NHibernate와 유사하게 작동한다고 생각합니다. 이것이 당신이 의미하는 것입니까 아니면 다른 것을 의미합니까? 첨부 된이 문제를 자세히 설명하는 설명서 링크가 있습니까?
RationalGeek

1
첨부하면, 객체와의 모든 상호 작용 이 구조 에서 이루어져야 함을 의미합니다 using(EFConnection conn = new EFConnection). 안전한 보관을 위해 해당 객체를 어딘가에 보관하려고 시도하면 빠른 업데이트를 수행하고 두 번째 using(...)문장으로 다시 저장할 수 있습니다. 다시 생각해야합니다. msdn.microsoft.com/en-us/library/bb896271.aspxmsdn.microsoft.com/en-us/library/bb896248.aspx를 참조 하십시오 . 마지막 버전에서 사용해야했던 EF 3.5를 사용하는 것은 그리 깨끗하지 않습니다.
Berin Loritsch

좋아, 이제 네가 무슨 뜻인지 알 겠어. 나는 사람들이 그것을 데이터베이스 에 항상 연결되어 있음을 의미하지 않도록하고 싶었습니다 . "첨부 된"엔터티의 상태를 유지 관리하는 개체 컨텍스트가 있어야합니다.
RationalGeek

2
사실이 아닙니다. EF는 분리 된 개체에 대한 강력한 개념을 가지고 있습니다. 분리 된 엔티티는 컨텍스트에 다시 연결해야 컨텍스트에 대한 컨텍스트 관련 조작 (예 : 데이터베이스에서 업데이트)을 수행 할 수 있습니다. 또한 메타 데이터 클래스는 EF가 엔티티를 생성하는 경우에만 필요합니다. POCO, IMO는 EF를 사용하는 훨씬 더 좋은 방법입니다. POCO를 사용하면 특히 테스트 작업이 훨씬 간단 해집니다.
매트 그리어

2

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

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

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

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


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

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


이 게시물은 읽기 어렵습니다 (텍스트의 벽). 더 나은 형태로 편집 하시겠습니까 ?
gnat

EF는 도메인 객체를 생성하지 않습니다. 그것들은 DAO입니다. 도메인 개체를 만들려면 개체의 데이터를 사용해야합니다. 어쨌든 서비스에서 도메인 개체를 다시 보내면 안되므로 반환하기 전에 도메인 개체에서 더 얇은 DTO를 만드십시오. EF는 생성 할 수 있어야 대부분 은 LINQ에 표현할 수 있다는 것을. 데이터베이스는 단위 테스트의 일부가 아니며 기능 테스트의 일부입니다. 즉, EF에 사용할 수있는 메모리 모의가 있습니다. 그렇지 않으면 EF 쿼리를 저장소로 추상화 한 다음 대신 조롱하십시오.
Sinaesthetic

예, 동의합니다. 오히려 Martin Fowler와 Carig Lairman이 설정 한 패턴을 말합니다. 하루가 끝나면 CTE, PARTITION BY 또는 CROSS APPLY를 사용할 수 없습니다. 또한 메모리 오버 헤드를 낮게 유지할 수있는 IDataReader를 사용할 수 없습니다. 또한 SQL Trace를 실행하고 EF가 전선을 통해 전송하는 것을 볼 때 나는 ;-)을 던지는 것처럼 느낍니다.
user104468

0

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

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

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

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

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


이것은 EF 1이 아직 새로 출시되거나 베타 버전 일 때 게시되었음을 명심하십시오. 오늘날 EF 4에서는 상황이 훨씬 나아졌으며, 그 투표에서 제기 된 많은 문제가 해결되지 않았습니다.
RationalGeek

마지막 요점은 여전히 ​​중요하며 매우 중요합니다.
M.Sameer

1
첫 번째 EF 버전은 3.5입니다. 4 가지 주요 버전의 EF가 출시되지 않았습니다.
매트 그리어

3
@Matt 맞습니다. 그러나 현재 버전을 나머지 .NET 4 버전 관리와 일치시키기 위해 EF 4라고합니다.
RationalGeek

1
그러나 그것이 유효한지 아닌지는 링크 요약에 영향을 미치지 않아야합니다. 유효한 경우 투표가 표시됩니다. :)
Adam Lear
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.