NHibernate와 LINQ to SQL
실제 프로젝트에서 두 기술을 사용하지 않는 사람이 두 기술이 서로 보완하고 기능이 많이 구축 아는 사람이 궁금합니다.
LINQ to SQL에서는 클래스 별 테이블 패턴을 많이 사용합니다. 이 패턴을 사용하면 쉽게 구현할 수 있고 기존 구조를 기반으로 도메인을 실행하는 데 거의 노력이 필요하지 않습니다. 간단한 응용 프로그램의 경우 이는 완벽하게 수용 가능하며 (종종 더 선호되는 경우도 있습니다) 더 복잡한 응용 프로그램의 경우 개발자는 종종 도메인 기반 디자인 패턴 (NHibernate가 용이하게하는 것)을 사용하는 것이 좋습니다.
클래스 별 테이블 패턴의 문제는 데이터베이스 구조가 도메인 디자인에 존재하는 것이 미친다는 것입니다. 예를 들어 고객의 기본 주소 정보를 보유하기 위해 다음 열이있는 고객 테이블이 가정합니다.
- 주소
- 시티
- 상태
- 지퍼
이제 고객의 우편 주소에 대한 열을 추가하여 고객 테이블에 다음 열을 추가 할 가정하겠습니다.
- MailingStreetAddress
- 메일 링 시티
- MailingState
- 메일 링
LINQ to SQL을 사용하면 도메인의 고객 개체에 이제 8 개의 열 추가에 대한 속성이 있습니다. 그러나 도메인 기반 디자인 패턴을 따르는 경우 주소 클래스를 작성하고 고객 클래스에 메일 주소와 현재 주소에 대한 두 개의 주소 특성을 보유하게 될 것입니다.
간단한 예이지만, 클래스 별 패턴이 어떻게 냄새가 나는 도메인으로 이어질 수 있는지 보여줍니다. 결국, 그것은 당신에게 달려 있습니다. 다시 말하지만 기본 CRUD (만들기, 읽기, 업데이트, 삭제) 기능이 필요한 간단한 앱의 경우 LINQ to SQL은 단순성 때문에입니다. 그러나 개인적으로 NHibernate를 사용하는 것이 더 깨끗합니다.
편집 : @ lomaxx- 예, 내가 사용은 단순하고 LINQ to SQL과 잘 작동하도록 최적화되어 있습니다. 나는 그것을 집으로 몰아 넣을 수 있도록 가능한 한 기본적으로 유지하고 싶었다. 요점은 데이터베이스 구조가 도메인 구조가 나쁜 아이디어라고 판단하거나 차선책 OO 설계로 이어지는 몇 가지 시나리오가 점입니다.
지금까지 놓친 두 가지 점 :
LINQ to SQL은 Oracle 또는 SqlServer 이외의 데이터베이스에서는 작동하지 않습니다. 그러나 더 나은 지원은 Oracle에 대한 더 나은 지원을 제공합니다 (예 : devArt의 dotConnect , DbLinq , Mindscape의 LightSpeed 및 ALinq) . (나는 이것에 대한 개인적인 경험이 없다)
Linq to NHibernate를 사용하면 Linq를 Nhiberate와 함께 사용할 수 있으므로 사용하지 않는 이유를 제거 할 수 있습니다.
또한 Nhibernate에 대한 새로운 유창한 인터페이스는 Nhibernate의 매핑을 구성하는 것이 덜 고통스러운 것처럼 보입니다. (Nhibernate의 고통 지점 중 하나를 제거)
최신 정보
Nhiberate에 LINQ는 지금이다 Nhiberate v3의 더 나은 알파 . Nhiberate v3가 올해 말에 발표 될 예정입니다.
엔티티 프레임 워크 .NET 4 등은 또한 실제 옵션처럼 보이기 시작 한다 .
@ Kevin : 당신이 제시하는 예제의 문제는 데이터베이스 디자인이 좋지 않다는 것입니다. 고객 테이블과 주소 테이블을 만들고 테이블을 정규화 할 생각했을 것입니다. 그렇게하면 제안하는 시나리오에 Linq To SQL을 확실히 사용할 수 있습니다. Scott Guthrie는 Linq To SQL 사용에 대한 훌륭한 게시물의 게시물을 가지고 체크 아웃하는 것이 좋습니다.
Linq와 NHibernate가 서로 함께 사용할 수 있음을 의미 할 수 있습니다. 이것이 가능하지만 하나를 선택하고 고수하는 것이 훨씬 낫습니다.
NHibernate를 사용하면 매우 유연한 방식으로 데이터베이스 테이블을 도메인에서 매핑 할 수 있습니다. 또한 HBL을 사용하여 데이터베이스를 쿼리 할 수 있습니다.
Linq를 SQL로 사용하면 도메인 개체를 데이터베이스에 매핑 할 수도 있습니다. Linq 쿼리 구문을 사용하여 데이터베이스를 쿼리 할 수도 있습니다.
Linq 쿼리 구문은 실제 타임에 컴파일러가 확인하여 쿼리가 유효한지 확인 하는 것이 가장 큰 차이점 입니다.
linq에서 필요한 사항은 .net 3.x에서만 사용할 수 있으며 VS2008에서만 지원할 것입니다. NHibernate는 VS2005 제공되는 것이 아니라 2.0 및 3.x로 제공됩니다.
그런 것들이 매핑 파일도 생성하지 않습니다. 이 작업을 수동으로 수행해야합니다. Linq가
자동으로이를 수행 할 수 있습니다.
Fluent NHibernate는 간단한 규칙에 따라 매핑 파일을 생성 할 수 있습니다. XML 작성이없고 강력한 형식입니다.
최근에 성능상의 이유로 Linq에서 SQL에서 NHibernate로 변경해야하는 프로젝트를 진행했습니다. 특히 L2S의 특성화 방식은 NHibernate의 디 토트보다 느리게 배열 변경 관리도 상당히 느립니다. 그리고 필요하지 않은 특정 시나리오에서는 변경 관리를 해제 할 수 있습니다.
예를 들어 WCF 시나리오에서 DataContext와의 연결이 변경된 많은 것을 사용하려는 경우 업데이트하기 위해 다시 DataContext에 연결하는 데 많은 문제가 발생할 수 있습니다. NHibernate와 관련하여 많은 문제가 없습니다.
내가 L2S에서 놓칠 것이 일반적으로 양쪽의 양쪽에서 관계를 유지하는 코드입니다. 그러나 NHibernate가 그 일을하기위한 도구가 있다고 생각합니다 ...
"LINQ"는 명확하게 설명 할 수있는 있습니까?
LINQ는 데이터 액세스 기술이 아니라 기본 구성으로 쿼리를 지원하는 언어 기능 일뿐입니다. 특정 인터페이스 (예 : IQueryable)를 지원하는 모든 객체 모델을 쿼리 할 수 있습니다.
많은 사람들이 LINQ To SQL을 언급하지 않습니다. Microsoft는 .NET 3.5 SP1과 함께 LINQ To Entities를 출시했습니다. 또한 NHibernate에는 LINQ 인터페이스가 있으므로 LINQ와 NHibernate를 사용하여 데이터를 얻을 수 있습니다.
LINQ는 LINQ 자체에 데이터베이스 "goings on"이기 때문에 LINQ to SQL을 의미합니다. 그것은 단지 SQL-ish처럼 보이게하기 위해 보트로드 된 syntac sugar가있는 쿼리 언어 일뿐입니다.
기본 예제 기본 예제에서 NHibernate와 LINQ to SQL은 같은 문제를 해결하는 제안합니다. 진정으로 NHibernate가 진정으로 많은 기능을 지원한다는 것을 알게 될 것입니다. 또한 LINQ to SQL을 사용하는 것과 거의 같은 방식으로 LINQ를 사용하여 NHibernate를 쿼리 할 수있는 LINQ to NHibernate 프로젝트도 있습니다.
서로 다른 두 가지를 분리 해 먼저 봅시다. 데이터베이스 모델링은 데이터에 관심이 있고, 관심이 있습니다.
Linq-to-SQL의 장점은 데이터베이스 스키마에서 클래스를 빠르게 생성하여 활성 레코드 개체로 사용할 수 있다는 것입니다 (활성 레코드 디자인 패턴 정의 참조).
NHibernate의 장점은 개체 모델링과 데이터베이스 모델링 간의 유연성을 허용하는 것입니다. 예를 들어 성능을 고려하여 데이터를 가장 잘 반영하도록 데이터베이스를 모델링 할 수 있습니다. 개체 모델링은 Domain-Driven-Design과 같은 접근 방식을 사용하여 비즈니스 규칙의 요소를 가장 잘 반영합니다. (Kevin Pang 주석 참조)
모델링 및 / 또는 명명 규칙이 좋지 않은 레거시 데이터베이스를 사용하면 Linq-to-SQL이 원하지 않는 구조와 이름을 클래스에 반영합니다. 그러나 NHibernate는 데이터 매퍼로 이러한 혼란을 숨길 수 있습니다.
데이터베이스의 이름 지정이 좋고 복잡성이 낮은 그린 필드 프로젝트에서는 Linq-to-SQL이 좋은 선택이 될 수 있습니다.
그러나 관례에 따른 매핑과 동일한 목적으로 자동 매핑과 함께 Fluent NHibernate를 사용할 수 있습니다 . 이 경우 XML 또는 C #을 사용하는 데이터 매퍼에 대해 걱정할 필요가 없으며 NHibernate가 사용자 정의 할 수있는 규칙에 따라 엔티티에서 데이터베이스 스키마를 생성하도록합니다.
반면 Linq-to-SQL의 학습 곡선은 NHibernate보다 작습니다.
또는 Castle ActiveRecords 프로젝트를 사용할 수 있습니다. 나는 레거시 프로젝트를위한 새로운 코드를 만들기 위해 짧은 시간 동안 그것을 사용 해왔다. 그것은 NHibernate를 사용하고 활성 레코드 패턴에서 작동합니다 (내가 아는 이름을 감안할 때 놀랍습니다). 나는 시도하지 않았지만, 일단 사용했다면 NHibernate 지원으로 직접 내려야 할 필요성을 느낀다면 프로젝트의 일부 또는 전부를 그렇게하는 것이 너무 많지 않을 것이라고 가정합니다.
"둘 중 하나도 사용하지 않은 사람을 위해"라고 썼 듯이 LINQ to SQL은 사용하기 쉬우므로 누구나 쉽게 사용할 수 있습니다. 또한 대부분의 시간에 도움이되는 프로 시저를 지원합니다. 두 개 이상의 테이블에서 데이터를 가져온 다음 프로 시저를 작성하고 해당 프로 시저를 디자이너로 끌어다 놓으면 모든 것이 생성됩니다. 프로 시저 이름이 "CUSTOMER_ORDER_LINEITEM"이고이 세 테이블 모두에서 레코드를 가져온 다음 작성하면됩니다.
MyDataContext db = new MyDataContext();
List<CUSTOMER_ORDER_LINEITEMResult> records = db.CUSTOMER_ORDER_LINEITEM(pram1, param2 ...).ToList<CUSTOMER_ORDER_LINEITEMResult>();
NHibernate에서 지원하지 않는 foreach 루프에서도 레코드 객체를 사용할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/26971/nhibernate-vs-linq-to-sql
'IT' 카테고리의 다른 글
iPhone 시뮬레이터에서 비행기 모드 시뮬레이션 (0) | 2020.07.19 |
---|---|
인라인 스타일의 CSS 의사 클래스 (0) | 2020.07.19 |
사전 대결-어느 것이 더 처음이라고? (0) | 2020.07.19 |
Xcode 4 체계의 이름을 바꾸는 방법이 있습니까? (0) | 2020.07.18 |
PostgreSQL-DB에 대한 자동 연결로 인해 데이터베이스를 수 없습니다. (0) | 2020.07.18 |