“Micro-ORM”의 이점은 무엇입니까?


21

필자는 Dapper와 같은 소위 "Micro ORM"을 조사해 왔으며 (.NET 4.0에 의존하는 정도는 적음) 현재 시스템 이후 본격적인 ORM보다 직장에서 구현하기가 더 쉽기 때문에 대규모 저장 프로 시저에 크게 의존하며 NHibernate 또는 EF와 같은 ORM과 함께 작동하려면 상당한 리팩토링이 필요합니다. 모든 기능을 갖춘 ORM에 대해 이들 중 하나를 사용하면 어떤 이점이 있습니까? 그것은 여전히 ​​원시 SQL을 작성하도록 강요하는 데이터베이스 연결 주위의 얇은 계층처럼 보입니다. 아마도 틀렸지 만 항상 ORM의 이유는 항상 SQL을 쓸 필요 가 없다는 이유로 들었 습니다. 자동으로 생성 될 수 있습니다; 특히 다중 테이블 조인 및 순수한 SQL에서는 쉽지 않지만 ORM에서는 사소한 테이블 간의 맵핑 관계에 적합합니다.

예를 들어 Dapper의 예를 살펴보면 다음과 같습니다.

var connection = new SqlConnection(); // setup here...
var person = connection.Query<Person>("select * from people where PersonId = @personId", new { PersonId = 42 });

명령을 작성할 필요가 없다는 점을 제외하고 수동 롤링 된 ADO.NET 데이터 계층을 사용하는 것과 다른 점은 매개 변수를 설정하고 빌더를 사용하여 엔티티를 다시 매핑한다고 가정합니다. 스토어드 프로 시저 호출을 SQL 문자열로 사용할 수도 있습니다.

Micro ORM이 사용하기에 여기서 또 다른 실체적인 이점이 있습니까? 몇 줄의 코드를 제외하고는 ADO.NET을 사용하는 "오래된"방법을 통해 어떻게 저장하는지 실제로 알지 못합니다. 여러분이 실행 해야하는 SQL (털이 생길 수 있음)을 알아 내기 위해 작성해야합니다. 여전히 테이블 (IMHO ORM이 가장 도움이되는 부분) 간의 관계를 매핑해야합니다.


+1 : 어떤 것에 관계없이 여전히 쿼리 언어가 필요하므로 linq 또는 sql과 같은 친숙한 것을 고수 할 수 있지만 예제와 같은 익명 유형을 반환해도 관계형 모델을 구체적 도메인에 매핑하지 않는 것 같습니다 모델. 그것은 나에게 이상하게 나타납니다.
Steven Evers

예, 문자 그대로 수행 var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });한 다음 dog.First().Age속성에 액세스하기 위해 사이트에서 Dapper의 구체적인 예를 찾을 수 없었습니다 .
웨인 몰리나

5
이 예제에서는 익명 형식을 반환하지 않습니다. "var"키워드는 C #에서 구체적인 형식 대신 사용하여 추가 형식을 저장하면 해당 쿼리는 IEnumerable <Person>을 반환합니다.
Ed James

1
주된 이유는 sprocs를 지속적으로 체크인해야하는 오버 헤드가 줄어들 기 때문에 사소한 CRUD 코드에 대한 procs를 저장하지 않아도 약 24 개의 SQL 파일을 업데이트해야한다는 점을 기억하십시오.
웨인 몰리나

2
sprocs를 사용하지 않고 동일한 버전 제어 시스템에서 모든 코드를 유지하고 SQL 및 기타 언어를 포함하여 여기에 코드를 의도적으로 사용하는 것이 주요 이점입니다. 아직 좋은 DB 간 데이터베이스 VCS를 만나지 못했습니다.
Ed James

답변:


12

은혜:

  • DataReader 및 구문 분석을 사용하는 원시 SqlCommand와 유사한 성능.
  • DataReader를 위해 고유 한 변환 레이어를 굴릴 필요가 없습니다.

솔직히 말하면 그 정도입니다. 객체 연결을 수행하는 SQL 연결에 대한 매우 가벼운 래퍼가 있습니다. 자동 생성 된 SQL을 처리하지 않고도 쿼리를 미세 조정할 수 있습니다.

단점 :

  • 약간 안전하지도 않습니다. SQL에서 오타를하면 CI 서버가이를 포착하지 못할 경우 자동화 된 UI 또는 기능 테스트 중에 발견 될 것을 희망해야합니다.
  • 유지하는 고통. DB 아키텍처와 밀접한 관련이없는 다양한 쿼리를 수행하는 많은 인라인 SQL 문이 있습니다. 이로 인해 기본 DB 구조가 변경 될 때 쿼리가 "왼쪽에"남게되어 빌드 타임에 다시 볼 수 없게됩니다.

그들은 자신의 자리를 가지고 있으며 DB와 상호 작용할 때 개발자로부터 "동키 작업"을 제거 할 수있는 매우 효과적인 도구이지만 실제로는 대규모 ORM을 대신 할 수는 없습니다. 유지 관리 비용이 증가하여 성능이 중요하지 않은 쿼리 시스템.

DB 쿼리 성능에 어려움을 겪고 있다면 SQL이 유효한지 컴파일 타임 표시 (추가 성능 이점)를 얻으려면 저장 프로 시저와 함께 이러한 매핑 프레임 워크를 사용하는 것이 좋습니다. .


이러한 미세한 orms의 래퍼로 사용할 수있는 라이브러리가있어 오타로 언급하는 문제를 줄일 수 있습니다. 예 : Dapper를위한 간단한 Crud 애드온
Srivathsa Harish Venkataramana

3

그는 마이크로 ORM PetaPoco 웹 사이트에서 다른 ORM과의 이점을 설명합니다. 더 설명하기

PetaPoco는 .NET 및 Mono를위한 작고 빠른 단일 파일 마이크로 ORM입니다.

  • Massive와 마찬가지로 모든 프로젝트에 쉽게 추가 할 수있는 단일 파일입니다.
  • Massive와 달리 강력한 형식의 POCO와 호환됩니다.
  • Massive와 마찬가지로 동적 Expandos도 지원합니다.
  • ActiveRecord와 마찬가지로 객체와 데이터베이스 테이블 간의 밀접한 관계를 지원합니다.
  • SubSonic과 마찬가지로 T4 템플릿으로 poco 클래스 생성을 지원합니다.
  • Dapper와 마찬가지로 동적 메소드 생성 (MSIL)을 사용하여 열 값을 특성에 지정하므로 빠릅니다.

1

명령을 작성할 필요가 없다는 점을 제외하고 수동 롤링 된 ADO.NET 데이터 계층을 사용하는 것과 다른 점은 매개 변수를 설정하고 빌더를 사용하여 엔터티를 다시 매핑 한다고 가정 합니다. 스토어드 프로 시저 호출을 SQL 문자열로 사용할 수도 있습니다.

나는 이것이 ORM의 다른 이점을 얻으려면 Micro-ORM의 주요 이점이라고 생각합니다. 코드가 상대적으로 작기 때문에 사용자 정의 해야하는 경우 더 쉽습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.