2010-04-23 2 views
6

질문은 Fluent NHibernate + multiple databases에서 따릅니다 (이 링크를 따라 할 필요는 없으며 충분한 배경이 있어야합니다).Fluent NHibernate와 Multiple Databases로 특정 엔티티의 세션 팩토리를 식별하는 방법

내 문제는 다음과 같습니다.

저는 Fluent NHibernate를 사용하고 있습니다. 내 응용 프로그램은 여러 데이터베이스를 사용합니다. 각 데이터베이스에는 자체 엔티티가 등록 (매핑)되어 있습니다. 그 결과, 각각 하나의 DB에 관련된 여러 개의 세션 팩토리가 있고 매핑 된 엔티티 집합 각각에 '포함'되어 있습니다.

로딩 엔터티의 경우 모든 등록 된 엔터티 (모든 DB에서)에 사용할 수있는 표준로드 메서드를 제공하는 일반 팩토리 클래스를 만들었습니다. 문제는 다음과 같습니다.로드 메서드는 처리해야하는 엔티티 클래스에 대해 올바른 세션 팩터 리를 사용해야합니다. 사용할 세션 팩토리를 어떻게 결정합니까? 나는 모든 세션 팩토리를 '손에 들고'(데이터베이스 이름으로 인덱싱 됨), 바로 사용할 세션 팩토리를 선택하기 위해로드하려는 엔터티의 유형을 알기 만하면된다. 예를 들어

:

GetSessionFactory (boType)에 갈 필요가 무엇
public IBaseBusinessObject CreatePopulatedInstance(Type boType, Guid instanceKey) 
{ 
    IBaseBusinessObject result = null; 
    ISessionFactory sessionFactory = GetSessionFactory(boType); 
    using (ISession session = sessionFactory.OpenSession()) 
    { 
    using (session.BeginTransaction()) 
    { 
     result = (IBaseBusinessObject)session.Get(boType, instanceKey); 
    } 
    } 
    return result; 
} 

?

읽어 주셔서 감사합니다.

답변

3

먼저 ISessionFactory.GetClassMetaData 메소드를 살펴 보겠습니다. 당신이 당신의 ISessionFactory 인스턴스의 목록을 관리 할 수 ​​있다면 당신은 당신의 타입 boType에 대한 메타 데이터를 가지고있는 하나를 찾을 때까지

IClassMetadata metadata = sessionfactory.GetClassMetadata(boType); 

, 당신은 그들을 통해 당신의 방법을 열거 할 수 있습니다.

필자는 한번도 사용 해본 적이 없지만 직접 참조 할 필요는 없지만 null을 반환하거나 형식을 인식하지 못하면 예외를 발생시킬 것으로 예상됩니다. 오류없이 메타 데이터 값을 얻으면 세션 팩토리가됩니다.

행운을 빕니다.

닐.

+0

대단히 감사합니다. 이 솔루션은 효과가있었습니다. – Trevor

+0

GetClassMetadata() 메서드는 지정한 형식이 해당 세션 팩터 리에서 관리되지 않는 경우 null을 반환합니다. – Trevor

+0

당신을 진심으로 환영합니다. –

관련 문제