2011-11-20 7 views
1

EF4 Fluent 스키마 용 IRepositoryIUnitOfWork 래퍼를 작성 중입니다.Entity Framework에서 DbModelBuilder를 사용할 때 연결을 관리하는 방법?

이 설계에서는 DbCompiledModel이 응용 프로그램 수명주기마다 한 번 생성됩니다 (NHibernate ISessionFactory과 유사). DbCompiledModel은 기존 데이터베이스 연결을 필요로하며 모두 DbContexts입니다.

DbCompiledModel이 생성되면, 새로운 DbContextnew DbContext(connection, compiledModel, true)

그래서 두 가지 선택에 직면하고

사용하여 만들 수 있습니다

public class DbCompiledModelFactory 
{ 
    public static DbCompiledModel Build(
     string mappingAssembly, DbConnection connection) 
    { 
     DbModelBuilder modelBuilder = new DbModelBuilder(); 
     AddMappingsFromAssembly(modelBuilder, mappingAssemblyName); 
     DbModel model = modelBuilder.Build(connection); 
     return model.Compile(); 
    } 
} 

: 하나는 전체를 하나의 DbConnection을 공유

DbCompiledModel 공장 모델 구축 프로세스를 위해 만료 된 DbConnection을 생성하고 DbContext을 만들 때마다 DbConnection을 새로 만듭니다.

제가 간과 한 연결을 효과적으로 관리하는 방법이 있습니까?

+0

EF는 앱 당 'DbCompiledModel'캐시를 캐시합니다. 왜 그 기능을 복제하고 싶습니까? – Eranga

+0

나는 나중에 다른 ORM으로 EF를 대체하기를 원하기 때문에 EF 위에 저장소/unitofwork 계층을 갖고 싶습니다. – duck9

+0

내 질문에 대답하지 않았습니다. ORM 교체/전환은 매우 어려울 것입니다. 불필요한 추상화에 시간을 낭비하고 있습니다. – Eranga

답변

0

연결 자체는 ADO.NET 공급자 및 매니페스트 토큰을 식별하는 데 필요합니다. Build 메서드에 인스턴스가 허용되는 오버로드 된 DbProviderInfo 인스턴스가 있습니다. 이 과부하는 내부적으로 DbConnection을 수용하는 과부하로 호출됩니다. 따라서 DbConnection이 마음에 들지 않으면 DbProviderInfo으로 버전을 직접 호출 할 수 있습니다.

나중에 다른 ORM이 필요할 것이라는 것을 알고 있으면 EF를 사용하지 마십시오. 여러 개의 ORM을 지원하도록 응용 프로그램을 설계하는 것은 모든 응용 프로그램을 미리 알고 응용 프로그램을 디자인 할 때만 사용할 수 있습니다. IMHO를 지원하면 하나 이상의 ORM이 필요하지 않으며 ORM을 대체하면 항상 애플리케이션이 변경됩니다.