2010-04-16 6 views
9

프로젝트는 3 개의 데이터베이스를 처리해야하는데, 이는 3 개의 세션 팩토리를 의미합니다. 내가 유창 NHibernate에이 같은 것을 할 경우 것입니다 : 모든 매핑을 선택할 것Fluent NHibernate + 다중 데이터베이스

.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())) 

공장, 다른 데이터베이스에 해당하는 경우에도 사람이

내가 본 당신을 자동 매핑 사용 때 이런 일을 할 수 있고 네임 스페이스별로 필터링 할 수 있습니다.

.Mappings(m => m.AutoMappings.Add(
    AutoMap 
     .AssemblyOf<Product>() 
     .Where(t => t.Namespace == "Storefront.Entities"))) 

나는 유창한 매핑을 위해 이와 같은 것을 발견했습니다. 내가 생각할 수있는 유일한 해결책은 각각의 db 매핑 클래스에 대해 별도의 어셈블리를 만들거나 명시 적으로 각 엔티티를 팩토리 구성에 추가하는 것입니다.

가능한 경우 두 가지를 모두 피하는 것이 좋습니다. 감사.

+2

이 인스턴스에서는 데이터베이스 당 하나의 매핑 어셈블리를 권장합니다. 관심사를 잘 구분하고 다른 개발자가 쉽게 이해할 수 있어야합니다. –

+0

다른 프로젝트에 모든 entitiy 클래스를 넣고 두 번째 db에 다른 프로젝트를 넣어야하는 것처럼 보입니다. – CallMeLaNN

답변

5

내가 엔티티가에 속하는 DB를하는 지시하는 유창함 매핑 파일에 정확히 사용 (내 자신의) 특성을 구현했습니다가. 나 또한의 개념을 가지고 '기본'데이터베이스 및 속성이없는 매핑 파일은 기본 DB에 있다고 가정합니다 (데코 레이팅해야하는 클래스 수를 줄임). 그런 다음 데이터베이스마다 세션 팩토리를 생성하는 초기화 코드가 있으며, 각각에 대해 리플렉션을 사용하여 모든 ClassMap 클래스를 찾고 속성을 검토하여 해당 클래스가 속한 DB를 결정하고 이에 따라 각 ClassMap을 등록합니다.

매핑 파일 예 :

[FluentNHibernateDatabase("MySecurityDatabase")] 
    public class SystemUserMap : ClassMap<SystemUser> 
    { 
    public SystemUserMap() 
    { 
     Id(x => x.SystemUserId); 
     Map(x => x.LoginId); 
     Map(x => x.LoginPassword); 
     Map(x => x.UserFirstName); 
     Map(x => x.UserSurname); 
     References(x => x.UserOrganisation, "OrganisationId"); 
    } 
    } 

은 분명히 나는 ​​/ 참조 사용하는 DB를의 목록을 정의했습니다. How to identify a particular entity's Session Factory with Fluent NHibernate and Multiple Databases

+3

이 시나리오에서는 특성을 어디에서 사용하고 있습니까? 매핑 구성에있을 것입니다. 그러나 구현의 세부 정보를 제공 할 수있는 기회가 있습니까? 감사! – reallyJim

+0

FluentNHibernateDatabase 특성은 어디에 있고 Fluently.Configure()는 어떻게 정의합니까? – CallMeLaNN

+0

특성은 내 자신이며 특정 클래스를 등록해야하는 DB를 식별하는 데 사용합니다 (특성에 대한 매개 변수는 내 DB에 지정한 이름 임). 나는 내가 '기본'DB로 간주하는 것을 구현했으며, 해당 DB의 엔티티와 관련된 모든 맵 파일은 속성을 필요로하지 않습니다. (또는 반대로 : 속성이없는 모든 맵 파일은 기본 DB). – Trevor

1

유형별로 필터링 할 수도 있습니다. 다음은 "브라운 필드 1"(즉, 두 개의 데이터베이스)과 같은 어셈블리에서 사용하는 "그린 필드"AutoPersistenceModel의 주석 처리 된 코드 줄입니다. 하지만 필터링 할 필요가있는 유형은 하나뿐이므로 레거시 어셈블리를 분리하지 않았습니다. 만약 당신이 DB를 다음 어셈블리별로 그들을 분할에 대한 그들의 제비를 가지고 최고의 IMO가 될 것입니다.

FNH가 다중 데이터베이스 지원 기능을 제공 할 수 있다면 멋질 것입니다. 그러나 어떻게 실제로 그렇게 할 수 있었는지는 알 수 없습니다. 아마도 SessionFactory의 일종의 사전 일 수도 있지만, 모든 상황은 매우 독특합니다.

HTH,
Berryl

/// <summary> 
    /// This would simply call <see cref="AutoMapHelpers.GetAutoMappingFilter"/> but we need to 
    /// exclude <see cref="LegacyProject"/> also for now. 
    /// </summary> 
    private static bool _getIncludedTypesFilter(Type t) { 
     return _isNotLegacy(t) && AutoMapHelpers.GetAutoMappingFilter(t); 
    } 
    private static bool _isNotLegacy(Type t) { return !t.Equals(typeof(LegacyProject)); } 
4

: 여기 내 질문을했습니다

: (I 누군가가 함께 도울 수 있기를 바랍니다)
내 구현은 지금까지 내가 찍은으로 작동하지만, 나는 난관에 부딪혔을 이 일을 쉬운 방법은 다음 스키마

에 데이터베이스 이름을 넣어하는 것입니다, 모든 테이블이 동일한 연결 문자열에 대한 액세스 제공, 당신은 하나의 세션 공장이 필요

0

비록 매우 늦은 반응이지만, 다음의 URL을 통해 infact에 해결할 몇 가지 해결책이 있으므로 해결책에 대한 해결책을 찾을 수 있습니다. Here은 귀하의 대답에 대한 해결책으로 url

에 의해 구현되었습니다. 현재 구현 된 솔루션으로는 데이터베이스 모델을 구현할 수 있습니다. 질문에서 GenerateSchema 메서드 사용을 피하십시오. 내가 언급 한 url에서 게시했습니다. 해당 메서드를 사용하는 것처럼 구현되지 않았기 때문에 동일한 테이블과 관계가 만들어진 여러 데이터베이스를 볼 수 있습니다.