2

지속성 NHibernate에 또 다른 SQL 서버에 엔티티 참조 실체와 도메인을 설계하는 방법 :나는 두 가지 간단한 개체가 도메인 디자인해야

public class User 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string Email { get; protected set; } 
    public virtual Country Country { get; protected set; } 
    ... 
} 

public class Country 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string Name { get; protected set; } 
    ... 
} 

그것은 모든 좋은 도메인 세계에서 분명를하지만 문제는 사용자입니다 및 국가는 두 개의 서로 다른 서버에있는 두 개의 서로 다른 데이터베이스에 보관되었습니다 (두 서버는 모두 MSSQL 2005 서버입니다).

그렇다면 NHibernate에서 다른 SQL 서버에 걸쳐서 엔티티의 지속성을 어떻게 올바르게 구현해야합니까?

참조에 개체 대신 ID를 사용 하시겠습니까? 네, 그렇습니다.하지만 도메인 객체를 DTO와 비슷하게 만드는 것은 전체 도메인 작업을 어렵게합니다. 그리고 IUserRepository는 User Entity를로드하기 위해 ICountryRepository를 사용할 것을 요구합니다.

연결된 서버는 무엇입니까? 흠 ... 어쨌든 나는 그것을 좋아하지 않는다 (분산 트랜잭션과 XML 컬럼 없음). 그리고 내가 그것들을 사용할 때 알아야 할 것이고 무엇보다 중요한 것은 어떻게 연결된 서버와 효과적으로 작동하도록 NHibernate를 설정해야 하는가?

다른 해결책이 있습니까?

답변

0

연결된 서버 이름 (예 : otherserver.dbo)을 포함하도록 클래스 매핑에서 schema 속성을 사용하는 사람들에 대해 들어 봤지만 그 중 하나의 문제 또는 다른 문제가 발생하지 않은 사람은 누구인지 몰랐습니다.

엔티티를 다른 데이터베이스에 투명하게 매핑 할 수있는 몇 가지 DDD 부트 스트래핑 프레임 워크가 있습니다 (이로 인해 여러 개의 ISessionFactories이 관리 됨). NCommon은 제가 권하는 것입니다. 그러나 이것은 Country이 하나의 데이터베이스에만 존재하고 User은 다른 데이터베이스에만 존재한다고 가정합니다.

거래의 경우 ... 음, TransactionScope을 사용하고 DTS를 구성하면 작동 할 수 있습니다. NCommon은 UnitOfWork API도 사용하며 TransactionScope을 래핑합니다.

Country이 ID가되도록 변경해야합니다. 이유가 여기 있습니다. 두 개의 세션 팩토리가 있는데, 하나는 Country에 대한 매핑이고 다른 하나에는 User에 대한 매핑이 있습니다. 만약 당신이 변경하지 않으면, NHibernate는 User을 저장할 때 Country에 대한 맵핑이 없다고 불평 할 것입니다 (두 개의 서로 다른 DB에 저장되기 때문에).

이제 NHibernate가 Country 속성을 무시하도록 지시하고 Country을 유지하여 도메인이 변경되지 않도록 할 수 있습니다. 그러나 다음 번에 데이터베이스에서 User을로드하면 국가는 null이됩니다.

+0

음 ... 명확히하기 : NCommon을 사용하면 개체를 투명하게 매핑 할 수 있으며 도메인 모델을 변경하지 않아도됩니다. 그런 식으로 작동하지 않을 수 있으며 국가 엔티티를 countryId 값 개체로 변경해야합니까? –

+0

NCommon을 사용하면 Country를 CountryID로 변경하고 식별자 만 저장하면됩니다.왜 나는 대답하는 대답을 설명 할 것입니다. – HackedByChinese

+0

알았어. 그러나 그 변화가 NCommon을 사용하는 데 어떻게 도움이 될까요? 내가 올바르게 이해했다면 다른 저장소에서 수동으로 국가 엔티티를로드해야 할 것입니다. NCommon 없이도 할 수 있습니다. –

0

NHContrib에서 NHibernate.Shards를 사용할 수 있습니다.

+0

일급급 모델입니까? 국가와 같이 완전히 풀어 놓은 실체에 사용될 수 있습니까? 그리고 NHibernate.Shards의 코드가 이미 완성되어 프로덕션 환경에서 사용될 수 있습니까? –

+0

필자가 아는 한, 다른 dbs에 엔티티를 두는 것을 지원하며, 프로덕션에서 사용할 수 있습니다. – ivowiblo

+0

이 프로젝트에는 알파 릴리스 유형이 있습니다. –

관련 문제