2010-12-04 5 views
0

나는 easilly 데이터베이스 드라이버 (데이터 공급자)를 교환 할 수있는 기대 C#C# 데이터베이스 상호 작용

에 사용자 데이터베이스 상호 작용을 처리하는 가장 일반적인 방법이 될 것입니다 무엇. 데이터처럼 - 내가 뭔가 에서 데이터 소스를 전환 할 수 있다면 DB-같은 뭔가를 (예를 들어, 일반 MySQL 데이터베이스에 대한) 절대적으로 다른 것이 좋을 것이라고 (그것이 가능하다면 확실하지)

는 또한 생각 xml 또는 임의의 이진 파일로 일련 화됩니다. 마지막 케이스에 Query-File 인터랙티브 래퍼 또는 이와 비슷한 것을 쓰는 것이 필요하다고 생각합니다.


그래서 - 사람 는 설명 동작을 달성 할 수있는 방법을 공유 할 수 있을까?

내 쿼리에는 확실히 LINQ을 사용할 수 있으며 일부 추상화를 소개하지만 데이터 원본을 서로 바꿔 쓸 수있을만큼 충분합니까?

예인 경우, 실제로 이것을 가져 오려면 어떻게해야합니까? 그리고 개발 파이프 라인은 어떻게 보입니까?

감사합니다.

답변

2

여기 연습 EF의 프레임 워크를 사용하여 작은 Respository 패턴입니다.

그것은 다음과 같을 수 있습니다 :

interface IRepository<T> where T : class 
{ 
    IEnumerable<T> FindAll(Expression<Func<T, bool>> exp); 

    T FindSingle(Expression<Func<T, bool>> exp); 

    // And many more! 
} 

이 인터페이스를 구현하는 추상적 인 '저장소'클래스를 만들기 : 우리는 지금 ModelClass 테이블에 대한 인터페이스를 만들 수 있습니다

class Repository<T> : IRepository<T> where T : class 
{ 
    TestDataContext _dataContext = TestDataContext(); // Would be your EF Context 

    public IEnumerable<T> FindAll(Expression<Func<T, bool>> exp) 
    { 
     _dataContext.GetTable<T>().Where<T>(exp); 
    } 

    public T FindSingle(Expression<Func<T, bool>> exp) 
    { 
     _dataContext.GetTable<T>().Single(exp); 
    } 

    // And many more! 
} 

/객체 구현 우리 'IRepository'그리고 추상 'Repository'클래스를 확장하고 'IModelClassInterface'를 구현하는 구체적인 클래스 :

interface IModelClassRepository : IRepository<ModelClass> 
{ 
} 

와 일치하는 저장소를 구현 :

class ModelClassRepository : Repository<ModelClass>, IModelClassRepository 
{ 
} 

나는 당신에게 유연성을 많이뿐만 아니라 당신이 가지고있는 모든 작은 개체를 제어 할 수있는 충분한 힘을주기 때문에이 방법을 사용하는 것이 좋습니다 것입니다.

그 방법을 호출하면 그런 식으로 아주 쉽게 될 것입니다 :

ModelClassRepository _repo = new ModelClassRepository(); 
_repo.Find.Where(something => something.IsRed && something.IsBig) 

예, 당신이 어떤 일을해야 함을 의미하지만, 당신이 나중에 데이터 소스를 변경할 쉽게 지옥이다.

원하는 데이터 제공자로 EF 프레임 워크를 전환 할 수도 있습니다. XML, db4o 또는 평범한 구형 Txt 여야합니다.

0

저장소 패턴을 찾아야합니다.

Asp.net도 등

+1

리포지토리 필자의 의견으로는 좋은 데이터베이스 추상화 도구 외에도 패턴을 사용해야한다. –

+0

그래, 저장소 패턴을 사용하여 코드가 특정 데이터베이스에 종속되지 않도록 유지 한 다음 Entity Framework와 같은 점잖은 orm을 사용하여 SQL 및 변경 내용 추적 처리의 어려움을 저장하십시오. – rtpHarry

0

1 워드 멤버 공급자 맵 제공자로서 가능한 구성 요소를 만들 수있는 공급자 패턴으로서 알려진 것을 사용한다.

NHibernate에

NH3.0은 LINQ를 지원하고 Posgres 또는 MyFailSQL에 대한 trival 스왑 아웃 SQL 서버.

"데이터가 XML 또는 임의의 이진 파일로 직렬화되는 것과 같습니다." 이게 무슨 뜻인지 모르겠다.

+0

나는 NHibernate를 "Generic"이라고 부르지 않을 것이지만 SQL 서버에서 MySQL 로의 DB 스와핑을 지원할 것이다. –

+0

L2S, EF, LightSpeed ​​등을 사용하는 것보다 "Generic"이 적지 만 LINQ 유형 쿼리를 사용하고 DB를 교환 할 수 있습니다. – Phill

0

.NET Framework에서 사실상이 표준의 표준은 Entity Framework입니다. 최근 EF 버전 4가 발표되어서 구 버전에 대한 많은 우려 사항을 해결 했으므로 소금물로 EF 온라인에서 발견 한 비판을 읽으십시오 - 읽은 기사의 날짜를 확인하십시오. 바로 지금 내 생각에 .NET 공간에서 가장 뛰어난 데이터베이스 추상화 도구입니다 (시도한 바 있습니다).

LINQ to SQL에주의하면서 Microsoft는 EF가 이제이 분야의 주력이기 때문에 제품 개선에 많은 자원을 투입하지 않을 것입니다.

+0

그리고이 기능을 처음 사용하는 경우 LINQ가 LINQ to SQL과 동일하지 않다는 사실을 알고 있어야합니다. – rtpHarry

0

LLBLGen Pro을 살펴 보시기 바랍니다. 우리는 ORM을 사용하고 있으며 경쟁을 날려 버립니다. 새로운 버전을 사용하면 도구를 사용하고 여러 프레임 워크 (엔티티 프레임 워크, nhibernate, linq-to-sql)에 대한 코드를 생성 할 수 있습니다. 그러나 그들의 프레임 워크는 많은 시나리오에서 가장 유연한 것으로 보인다.

Frans에서 그의 blog에 대한 자세한 정보를 찾을 수 있습니다. 그는 LLBLGen의 주요 LLBLGen 전문가이자 원 제작자입니다.

someRepository.Find.Where(something => something.IsRed && something.IsBig) 

데이터 액세스에 대한 모든 방법을 포함하는 유형 T의 'IRepository'라는 일반적인 인터페이스를 만들기 :

+0

어댑터 모델을 사용하면 엔티티와 데이터베이스 드라이버가 완전히 분리되어 엔티티가 지원되는 모든 데이터베이스 드라이버를 가리킬 수 있습니다. –

0

"C#에서 사용자 데이터베이스 상호 작용을 처리하는 가장 일반적인 방법은 무엇입니까?"

가장 일반적인 방법은 ADO.NET ... DB의 저장 프로 시저 호출 또는 SQL 블록 만 사용하는 것이 장점입니다. 그러나 OOP에 쉽게 추상화되지 않기 때문에 많은 단점이 있습니다 ... 어떤 인텔리 센스도 가지고 있지 않습니다 ... EF는 이러한 단점을 많이 다루기 때문에 매우 멋지지만 문법이 조금 익숙해지면