2009-03-12 5 views
1

저는 고급 NHibernate 사용자가 아니기 때문에 다소 중요 할 수 있습니다. 아직 발견하지 못했습니다. NHibernate에 설정 요소를 지정하는 경우가 작성하는 것만으로는 충분하지 않습니다NHibernate 세트 매핑이 DRY가 아닌가?

public class House 
{ 
    public int Id { get; set; } 

public ISet<Room> Rooms 
{ 
    get; 
    set; 
} 

} 

:

<set name="Rooms"> 
    <key column="RoomId"/> 
    <one-to-many class="Room"/> 
</set> 

이 보인다 :

<set name="Rooms" /> 

을 대신 나는 적어도 작성해야

클래스를 고려 DRY 원칙을 위반하는 것. Set 인 경우 기본값은 일대 다 관계 여야합니다. 클래스는 컬렉션의 제네릭 유형에서 유추되어야하며 키 열로서 컬렉션 요소의 클래스의 기본 키가 사용되어야합니다.

이것은 합리적인 기본값처럼 보입니다. 그렇다면 왜 NHiberbate는 그것에 대해 영리하지 못하며, 이러한 여분의 3 줄을 입력해야합니까?

답변

0

Fluent NHibnernate을보실 수 있습니다. DSL은 DRY에서 영감을 얻었습니다.

편집 : 죄송합니다 ... 더주의 깊게 읽어해야 귀하의 예제, 유창함 NHibernate에 당신이로 매핑 표현할 수 있도록 할에 관한

그러나

HasMany(x => x.Rooms); 

의 hasMany의을 (또는 일대 다) 관계는 IList에 매핑됩니다. 이 기능을 추가로 사용자 정의 할 수 있는지 확실하지 않습니다. Fluent 맵을 ISet에 기본값으로 사용하십시오. 그러나 표준 매핑 선언보다 덜 반복적입니다.

다음은 매핑 선언에 대한 몇 가지 예입니다. Fluent NHibernate Wiki.

+0

FluentNHibernate에 대해 알고 있습니다. 그러나 그것은 나를위한 선택 사항이 아니며 여전히 질문에 대답하지 않습니다. –

0

일반 컬렉션을 사용하지 않으면 어떻게됩니까? NHibernate가 버전 1.2에서와 같이 generics만을 지원한다고 잘못 생각하지 않는다면; 그래서 이전 버전에서는 타입 유추가 확실히 가능하지 않았습니다.

기본 ID가 관련 테이블의 외래 키로 사용되지 않는 레거시 DB를 사용하면 어떨까요?

+0

그럼 기본값으로 가지 않을 것입니다. 그러나 이러한 값을 기본값으로 사용하면 IMHO를 이해할 수 있습니다. .NET 1.1에서 의미가 있었지만 더 이상 그렇지 않습니다. 그래서 남은거야? –

1

왜냐하면 NH가 매핑을 기반으로 프록시를 만들 때 어셈블리를 거쳐야하고 프록시를 통해 필요한 작업을 수행해야하기 때문입니다. 이것은 NH 공장의 시작 시간을 증가시킵니다.

관계형 매퍼의 객체라는 것을 잊지 마십시오. 추가 노드 (키) 중 최소한 하나가 필요하므로 DB 키가 작동하는 데 필요한 것이 무엇인지 알려줍니다. 이렇게하면 DB에 매핑 할 때 원하는만큼 융통성있게 사용할 수 있으며 기본값으로 고정 배선되지 않습니다.

DRY가 중단 되나요? 혹시. 나는이 경우에 신경 쓰나요? 아니 정말.

관련 문제