7

새로운 Windows 프로젝트를 준비 중이며 사용할 DAL 기술의 종류가 궁금합니다. 원래 건물을 짓는데 너무 많은 시간을 소비하지 않는 더 간단한 것을 찾고있었습니다. 그러나 장기적으로 볼 때 효율적이고 확장 가능해야한다는 것도 알고 있습니다.새로운 .NET 3.5 프로젝트 : 어떤 DAL 기술을 사용해야합니까?

3 계층 시스템에서 WPF (MVVM) 클라이언트 및 WCF 서비스를 사용할 계획입니다. 조금 구식,하지만 매우 쉽게 사용할 수 있습니다 및 대부분의 지역이 자동으로하자

PRO

데이터 집합 :

그냥 내가 익숙 기존의 모든 기술을 요약합니다 생성되었습니다. 데이터 세트에 관한 한 가지 강력한 측면은 관계를 통해 관련 데이터를 쉽게 탐색 할 수 있다는 점입니다. 또한 데이터베이스에서 연결이 끊긴 방식으로 타임 스탬프를 자동으로 처리하여 업데이트를 단순화 할 수 있습니다. 유효성 검증을 포함합니다.

명칭 : 꽤 오래된 구식. 어떤 이들은 실제 비즈니스 객체/모델이 아니라 SQL 데이터 테이블의 미러라고 생각합니다. WCF 서비스/클라이언트간에 전달하는 것은 자체 생성 된 비즈니스 개체보다 어려울 수 있습니다.

엔터프라이즈 라이브러리 4.1 - 데이터 액세스 블록

PRO 다음 DAL 아름답게 팩토리 패턴으로 배치됩니다. 자동으로 연결 개폐를 처리합니다. 대부분의 경우 매우 사용하기 쉽습니다. 그것은 당신의 비즈니스 객체를 만들기 위해 dataSets와 일반적인 SQL Sps를 모두 지원합니다. 지속적인 프레임 워크의 일부로 효율적인 최종 제품을 위해 나머지 엔터프라이즈 라이브러리와 함께 사용하는 것이 훨씬 효율적입니다.

명칭 : ??

Linq는 SQL

PRO : 자동 비즈니스 오브젝트로 SQL 테이블을 생성합니다. CRUD하기 쉽습니다. 이론적으로는 아주 좋은 방법입니다.

CONTRA : 나왔을 때 주변에서 놀았 으면, 나는 그것이 엷어 지거나 때로는 불안정하다는 것을 발견했습니다. Microsoft가 발표 한 Entity Framework 4.0 (.NET 4.0의 일부)은 Microsoft에서 권장하는 방식으로 이미 죽은 기술로 간주됩니다. .NET 4.0에는 몇 가지 버그 수정이 예상되지만 계획을 확장하는 기능은 더 이상 없습니다.

엔티티 프레임 워크 4.0

나는 그것에 대해 아무것도 모르지만, 결국 .NET 4.0에서와 다른 모든 것들을 대체 할 유일한 것이다. 나는 또한 그것을 사용하고 싶은 유혹을 받는다. 그러나 베타에 아직도 그것 이후, 나는 그 길을 아직 갈 수 없을 것이다.

엔터프라이즈 라이브러리 4.1 - 데이터 액세스 차단을 사용하고 내 비즈니스 개체를 만들려고 매우 유혹 받고 있습니다. 큰 사기꾼은 DAL을 만드는 데 더 많은 시간이 걸릴 것입니다. 누군가가 데이터 액세스 블록을 통해 DataSets을 사용하도록 나를 설득 할 수 없다면.

의견 및 아이디어는 무엇입니까? 많은 감사합니다. 케이브

답변

3

Linq to SQL 옵션에 대한 "contra"의 일부로 Entity Framework가 언급되었지만 Linq to SQL 대신이 기능을 고려해야합니다. 소규모 데이터베이스를 사용하는 프로젝트의 경우 엄청난 돈을 벌 수 있습니다. 대규모 데이터베이스의 컨텍스트를 관리하는 것은 EF에서 어려울 수 있으며 스키마 변경으로 인해 문제가 발생할 수 있지만 이러한 문제는 모든 데이터 액세스 방식에서 발생합니다.

내 마음 속에서 EntLib의 가장 큰 단점은 사용자가 여전히 자신의 데이터 개체를 돌리고 있다는 것입니다. 엔터프라이즈 라이브러리는 직선적 인 "구식"ADO.NET 구현에서 많은 배관 코드를 제거합니다. 그러나 이는 LINQ 쿼리를 위해 즉시 사용할 수있는 데이터 개체를 생성하지 않습니다.

+0

나는 약간의 생각을하고 있었고 나는 당신이 옳다고 생각한다. EntLib를 사용하는 것은 손으로 모든 것을 만드는 많은 작업을 여전히 의미합니다. EF에 대해 언급 할 때 버전 4.0 베타를 의미 했습니까? 아니면 실제 버전 1.0을 의미합니까? 나는 실제로 지난 밤에 버전 1.0을 시험해보고 있었고 나는 그것이 꽤 괜찮아 보인다는 것을 말해야 만한다. 그 직전에 SubSonic을 시도했는데, 기존의 필드 중 하나와 동일한 이름을 가진 조회 테이블 용 코드를 만들지 못했습니다. 이것은 Subsonic을 혼동 시켰을 것입니다. EF 1.0은 그 일을 완벽하게 잘했으며 나는 이렇게 갈 것이라고 생각합니다. 어떻게 생각해? – Houman

+0

EF 1은 LinqToSql만큼 풍부한 기능이 아니며 LinqToSql은 현명한 기능이 아닙니다. EF 1은 LinqToSql이 지원하는 적절한 지연로드 지원과 같은 기본 ORM 개념에 대한 지원이 누락되었습니다. –

+0

저는 EF 1.0을 몇 가지 응용 프로그램에 사용했습니다. 데이터베이스 크기가 작고 성능에 치명적이지는 않았지만 충분히 만족했습니다. 기본 요구 사항은 "데이터를 데이터베이스 안팎으로 가져 오는 것"이었습니다. 기능, 확장 성 및 성능이 큰 관심사라면 EF를 시도해 볼 수 있지만 CSLA와 같은 다른 소프트웨어 계층을 사용하여 데이터 액세스를 추상화하여 나중에 데이터 액세스 기술을 전환하거나 업그레이드 할 수 있습니다. 물론 그 시점에서 RAD 혜택이 더 이상 없을 수도 있으며 전체 맞춤 스택을 고려할 수도 있습니다. –

1

A. NHibernate를 확인하십시오.

B. 데이터 세트 - 가장 빠르고 쉬운,하지만 당신은 많이 코딩합니다.

나머지 - ORM 도구를 사용하면 많은 이점이 있지만 3 가지 계층화에 많은 문제가 있습니다. 그것은 당신의 중요한 요구 사항이며, 얼마나 많은 것을 의존 -

그래서

(게으른 로딩 효과 성능, 캐싱이 가능한 스마트없는 큰 개체 나무를 많이 만들고, 처리 할 수있는 문제이다) 당신이 코딩을 시작하기 전에 EL/LINQ 또는 NHibernate를 공부하기 위해 소비하고자하는 시간, b/c이 도구로 학습 곡선이 있습니다.

2

우리는 이전에 EntLib 4.1 데이터 응용 프로그램 블록과 함께 DataSets를 사용했습니다.

이제 Entity Framework를 사용합니다. EntLib 4.1과 비교하여 Entity Framework의 생산성이 크게 향상되었습니다. (80 테이블 대신 80 테이블에 대한 데이터 레이어 프로그래밍)

Entity Framework 4는 아직 베타 버전이지만 프로젝트가 시작되기까지 일정 기간이 지나면 EF 4를 사용하게됩니다. ORM의 동시에 유연성을 사용하여 POCO (Plain Old Clr Objects)

+0

경험을 공유해 주셔서 감사합니다. EF 1.0 또는 EF 4.0 Beta를 사용하셨습니까? – Houman

+0

@ 케이브, EF 1.0 이었지만 베타 버전에서 사용하기 시작했습니다 –

1

동시에 두 기술을 동시에 사용할 수 있습니다. 어떻게 할 수 있습니까? 저장소 패턴을 사용하면 매우 간단합니다. 처음에는 일반 IRepository 인터페이스를 만들어야합니다. 뭔가 좋아해요 :

public interface IERepository<E> 
{ 
    DbTransaction BeginTransaction(); 
    void EndTransaction(); 
    void Add(E entity); 
    void Delete(E entity); 
    int Save(); 

    ObjectQuery<E> DoQuery(string entitySetName); 
    IList<E> SelectAll(string entitySetName); 
    E SelectByKey(int Key); 

    bool TrySameValueExist(string fieldName, object fieldValue, string key); 
    bool TryEntity(ISpecification<E> selectSpec); 

    int GetCount(); 
    int GetCount(ISpecification<E> selectSpec); 
    int AddAndSave(E entity); 

} 

나는 Entity Framework를 선호합니다. 나는 그것을 기반으로 3 개의 프로젝트를 만들었습니다. 그것은 매우 빠르게 작동하며, 특히 페이징 (paging)을 사용하는 쿼리입니다. 그래서 IRepository 인터페이스를 구현하는 가상 메소드가있는 기본 제네릭 클래스 저장소를 만들어야합니다. 그리고 그게 다야.

public class MonthRepository:Repository<Month> 
{ 

} 

당신은 기본 클래스의 모든 메소드를 무시하고 당신이 필요로하는 저장 프로 시저를 사용하여 DB에 대한 액세스를 만들 수있는 가능성이 있습니다 이제 당신은 다음과 같은 간단한 코드를 작성 DAL를 만들 수있는 매우 빠른 방법이있다. 다른 곳에서 코드를 변경하지 않고도 할 수 있습니다. 귀하의 의지는 여전히 동일한 유형의 개체를 반환하지만 다른 방식으로 가져옵니다.

학년 때 락커룸 더 http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx

+0

고마워요. 이 솔루션은 저장소를 교환 할 때 더 많은 유연성을 줄 수 있다면 실제로 흥미로운 것으로 들립니다. 나는 아직도 그것을 이해할 필요가있다. 일을 공부하고 며칠 만 기다려주세요. ; o) – Houman

1

에 NHibernate에이 기능 세트, 성숙 및 지원의 최선의 전체 믹스를 가지고있다.

NHibernate, Entity Framework, active records or linq2sql

당신은 Linq는 어떤 고려해야 솔루션 이상 Linq를 지원하지 않는 첫 번째 두 가지 옵션에 대한 우선 순위를 지원 고려해야한다.

+0

안녕 마이클, 나는 또한 NHibernate에 대해 읽고 있었다. 나는 문서가 곧은 것이 아니라는 것을 발견했고 그것을 실행하는 데 매우 복잡한 응용 프로그램 인 것으로 보인다. 내가 아직 모르는 일부 어려운 웹 사이트를 알지 못한다면 거기에서 조금 잃어버린 느낌이 든다. Unfortunatelly SubSonic은 버그 때문에 저에게 효과적이지 않았습니다. 시도해 볼 수있는 Castle Project가 아직 남아 있습니다. EF 1.0과 같은 MS 솔루션을 사용할 수있게되면 곧 v4.0으로 업그레이드 할 수 있습니다. – Houman

+0

당신이 NHibernate 주위에 길을 찾을 수 없다면, 당신은 LinqToSql이나 EntityFramework에서 필요한 것을 얻지 못할 것이다. NHibernate의 문서는 다른 ORM의 문서보다 나쁘지 않습니다. ORM에 대한 학습 곡선이 있으며, NHibernate의 곡선은 현재 더 빨리 시작됩니다. NHibernate는 요구 사항을 충족시킬 가능성이 높지만 다른 것들은 특정 시점까지만 요구 사항을 충족시키고 NHibernate를 다시 시작하게됩니다. 궁극적으로 귀하의 부름과 책임입니다. –

+0

감사합니다. Michael. Fluent NHibernate에 대해 어떻게 생각하세요? 나에게 매핑이 자동으로 생성되도록하는 일종의 마법사입니까? NHibernate를 더 쉽게 사용할 수있는 도움 도구가 있습니까? – Houman