2
내가 유창함 NHibernate에 간단한 상속 계층 구조를 오토하기 위해 노력하고있어

에 적용, 그리고 동급 이상의 각 테이블에 대해 약간 다른 이름을 가질 필요가되지 않습니다 (대신 밑줄 파스칼 케이스). 이것은 규칙을 사용하는 명백한 장소처럼 보입니다. 나는 또한 sub-per-subclass 전략을 사용하고 싶지만 그 조합은 나에게 문제를 일으키고있는 것처럼 보입니다. 규칙은 계층 구조의 기본 클래스에만 적용됩니다. 실제로유창함 NHibernate에 자동 매핑 클래스 규칙은 전체 클래스 계층

abstract class BaseRule -> Base_Rule 
    class NumberRule : BaseRule -> Number_Rule 
    class PatternStringRule : BaseRule -> Pattern_String_Rule 

받고 있어요 무엇 :

BaseRule -> Base_Rule 
    NumberRule -> NumberRule 
    PatternStringRule -> PatternStringRule 
-

내 클래스 매핑 방법을
AutoMap 
    .AssemblyOf<BaseRule>() 
    .IncludeBase<BaseRule>() // "BaseRule" is an abstract class 
    .Conventions.Add(DefaultCascade.All()) 
    .Conventions.Add<OracleTableNameConvention>() 

(> 테이블 이름 클래스 이름) : 여기

내 자동 매핑입니다

보시다시피 기본 클래스 만 실제로 변경됩니다. 여기에 기존 규칙은 당신이 내가 그것을 정의하고있어 방법을 볼 수 있습니다 만, 그래서이다 (나는 또한 ISubclassConvention 인터페이스로 검토 한

public class OracleTableNameConvention : IClassConvention 
{ 
    public void Apply(IClassInstance instance) 
    { 
     string fixedName = instance.EntityType.Name.ToUnderscoredNaming(); 
     instance.Table(fixedName); 
    } 
} 

, 테이블의 이름을 조정하기 위해 거기에 방법을 볼 수있는 충분한 의미가있다, 하위 클래스는 항상 자신의 테이블에있는 것은 아니다). 내 자동 매핑에서 IncludeBase 라인을 삭제하면

는, 이름은 테이블 당 구체적인 수준이된다 제외하고 내가 원하는 것을하게된다. 모든 공통 데이터를 하나의 공유 기본 테이블에두고 테이블 서브 클래스을 사용하고 싶습니다.

각 이름에 우선 적용을 추가 할 수 있습니다. 필요한 경우 제공 하겠지만 차라리 사용하지 않을 것입니다. 그것은

이 같은은 분명히 지원 행동해야한다 보인다. table-per-concrete-class를 사용하지 않고 계층 구조의 각 테이블에 명명 규칙을 적용하려면 어떻게해야합니까?

답변

4

이 질문을 게시하자마자 알아 냈습니다.

IJoinedSubclassConvention은 구현하는 데 필요한 인터페이스입니다.

public class OracleSubClassConvention : IJoinedSubclassConvention 
{ 
    public void Apply(IJoinedSubclassInstance instance) 
    { 
     string fixedName = instance.EntityType.Name.ToUnderscoredNaming(); 
     instance.Table(fixedName); 
    } 
} 

나는 방법이 Table(string) 인 것을 찾았습니다.