2010-03-15 4 views
0

누군가가 레거시 데이터베이스를 매핑하는 데 도움이되기를 바랍니다. 여기에 설명 된 문제는 다른 사람들을 괴롭 히지 만 아직 웹에서 좋은 해결책을 찾을 수 없습니다.NHibernate 레거시 데이터베이스 매핑이 불가능합니까?

면책 조항 : 이것은 레거시 DB입니다. 복합 키 키를 제어 할 수 없습니다. 그들은 술을 마시고 아무리 바꿔도 변하지 않을 것입니다. suck. 대리 키를 추가 할 수 없습니다. 옵션이 아니기 때문에 이들 중 하나를 제안하지 마십시오.

두 테이블 모두 합성 키가 있습니다. 하나의 테이블의 키 중 하나가 다른 테이블에서 컬렉션을 가져 오기 위해 키의 일부로 사용됩니다. 즉, 키가 테이블간에 완전히 일치하지 않습니다. ClassB는 가능한 경우이 매핑의 목적으로 의 속성을 추가하는 것을 피하기 위해 모든 곳에서 사용됩니다.

public class ClassA 
{ 
    //[PK] 
    public string SsoUid; 

    //[PK] 
    public string PolicyNumber; 

    public IList<ClassB> Others; 

    //more properties.... 

} 

public class ClassB 
{ 
    //[PK] 
    public string PolicyNumber; 

    //[PK] 
    public string PolicyDateTime; 

    //more properties 
} 

나는를 ClassA의 인스턴스를 얻을 PolicyNumber 일치하는 모든 ClassB가 행을 싶어. 나는 일대 다 (many to many) 일 수도 있다는 것을 깨닫고 있습니다. 일대 다 (many to many) 일 수도 있습니다.

연관 클래스를 사용해 보았지만 제대로 작동하는 경우 까지 볼 수 없었습니다. 나는이보다 복잡한 매핑을 처음 사용하고 있으며 조언을 구하는 경우 을보고 있습니다. 나는 거의 모든 아이디어에 열려 있습니다.

감사합니다,

답변

1

코리 매핑 레거시 데이터베이스 스키마를 처리하는 가장 쉬운 방법은 기본 키를 생성 대리를 추가하는 것입니다 (즉, SQL Server의 정체성) 각 데이터베이스 테이블 및 고유 제한 조건에 기존의 복합 기본 키를 변경 . 이것은 당신이 당신의 기존 외래 키를 유지하고 NHibernate 매핑을 쉽게 만들 수 있습니다.

그럴 수 없다면 매핑에서 property-ref를 사용하여이를 수행 할 수 있습니다.

편집 : 항상 빈혈 도메인 모델로 돌아갈 수 있습니다. 즉, 각 클래스를 맵핑하지만 관계를 제외하십시오. 키에 의해 ClassA를 얻는 하나의 데이터 액세스 메소드와 PolicyNumber에 의해 ClassB 콜렉션을 가져 오는 데이터 액세스 메소드가 있습니다.

+0

복합 키에 관한 내 게시물을 얼마나 열심히 시도하든 관계없이 사람들이 DB를 변경하라는 제안을 끊을 수는 없습니다. 열쇠를 추가 할 수 없다는 말은하지 않았지만, DB는 변경할 수 없습니다. 나는 오랫동안 그 싸움을 해왔다. 면책 조항 : 이것은 기존 DB입니다. 나는 복합 키를 제어 할 수 없다. 그들은 빨고, 당신이 그들이 빨다 고 말해도별로 바꿀 수 없다. 대리 키를 추가 할 수 없습니다. –

+0

나는 "나는 거의 모든 아이디어에 개방적"이지만 "대리 키를 추가 할 수 없다"는 것을 알았다. 편집을 추가 할 생각이 하나 더 있습니다. –

+0

댓글 뒤에 사로 게이트 키에 관한 부분을 실제로 추가했습니다. 나는 그 부분을 나갔다는 것을 압니다. 아이디어를 가져 주셔서 감사합니다. –

관련 문제