2014-01-22 3 views
3

저는 NHibernate에 새로 도입되었으며 매핑 파일을 만들어 데이터 모델 프로젝트를 확장하려고합니다. 내가 매핑하는 특정 테이블은 AttributeDef라는 이미지로, ControlType 열은 실제로 Code라는 테이블의 조회와 관련이 있습니다 (예, 알고 있습니다 - FK 제약 조건이 있어야하지만이 종류의 작업은이 프로젝트에서 매우 일반적입니다. 분명한 견해를 무시하고 질문에 집중하십시오.) 대부분의 경우 Code를 참조하는 테이블에는 코드에서 키로 사용되는 CodeSet 테이블의 ID가 포함 된 열이 거의 불가피하게 복합 키이지만이 경우에는 원저자가 "이봐, 모두 다 동일한 코드 세트에서 요점은 무엇입니까? " 코드 세트의 값을 포함 AttributeDef의 열이 있다면 Nhibernate 매핑 파일의 하드 코딩 된 값

Table structure relating to problem

이제 다음 매핑은 많은 문제되지 않을 것입니다. (개념적으로이 예제에서는 FormControlCodeSet라고도 함) 코드 세트 값 AttributeDef의 열이 있다면

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="Activus.DataModel" namespace="Activus.DataModel"> 

    <class name="Code" table="Code" mutable="false"> 

    <composite-id name="CompositeCodeId" class="CompositeCodeId"> 
     <key-property name="CodeId" column="CodeId"/> 
     <key-property name="CodeSet" column="CodeSet"/> 
    </composite-id> 

    <property name="Description" column="Description" type="string" length="100" not-null="true"/> 
    <property name="ExternalRef" column ="ExternalRef" type ="string" length ="256" not-null ="true"/> 
    <property name="InternalRef" column ="InternalRef" type ="string" not-null ="false"/> 
    <many-to-one name="CodeSet" class="CodeSet" column="CodeSet" not-null="true" insert="false" update="false"/> 

    </class> 

</hibernate-mapping> 

따라서 다음 내 AttributeDef 매핑 파일에 내가

<many-to-one name="ControlType" class="Code" not-null="false"> 
    <column name="ControlType" /> 
    <column name="FormControlCodeSet" /> 
</many-to-one> 
이 포함됩니다 : 코드 엔터티에 대한 매핑은 다음과 같습니다

그리고 모두 잘되어야합니다. 문제는 AttributeDef에 해당 열을 추가하는 것이 매우 복잡하기 때문에이 변경 사항을 수용하기 위해 많은 변경 작업을 수행해야합니다. 그러면 변경 사항의 위험 요소가 커질 수 있습니다. 수용 할 수없는 (그들의 시간대에 주어진 클라이언트의 관점에서).

그래서, 많이 찬찬히 끔찍한, 끔찍한 일이, 그것은 해당 행을 (를 속삭) 하드 코드 값으로

<column name="FormControlCodeSet" /> 

를 대체 할 수 있습니까? 그 가치는 10 년 후에도 변하지 않았으며 조만간 나타날 가능성은 희박하지만이 변화를 넘어서고 여분의 칼럼을 포함시키고 구현할 필요성을 강조 할 것입니다. 나는 이것이 얼마나 무서운가를 잘 알고 있지만 불행히도이 데이터베이스는 ORM에 적합하지 않습니다. 어쨌든 구두끈을하고있는 것에도 불구하고 말입니다.

답변

2

NHiberante를 사용할 때 요구 사항을 속삭여 줄 필요가 없습니다. 레거시 데이터베이스 (즉, 고정 DB 스키마)과의 협력이 꽤 표준이기 때문에, NHibernate는 많은 다른 설정을 지원합니다. 이들의

하나는 (치환) 설정 한 쌍의 : "formula""column". 첫 번째 열은 이고 두 번째 열이 이 되려면이 필요합니다. 열, 열을 가져 와서 상수를 전달하십시오. 그래서 :

<many-to-one name="ControlType" class="Code" not-null="false"> 
    <column name="ControlType" /> 
    <!-- let's replace this --> 
    <!--<column name="FormControlCodeSet" />--> 

    <!-- 1) with a constant number 123--> 
    <formula>123</formula> 
    <!-- 2) with a constant string 'constantString' --> 
    <formula>'constantString'</formula> 
</many-to-one> 

아니 FormControlCodeSet 상수 int 또는 string해야하지만, 위 그림과 같이 옵션 중 하나가 가능한 경우 확인합니다.

+0

완벽한 - 감사합니다. 나는 '상수'와 같은 요소를 찾고 있었으며 '수식'도 고려하지 않았습니다. 이제는 상사에게 그러한 것들에 의존해야하는 것이 얼마나 가난하고 실제로 '관계형'부분을 향상시켜야 하는지를 확신시켜야합니다. –

+0

그게 도움이된다면 어쨌든 도움이된다.) NHibernate –

+1

을 즐겨라. 상수의 사용을 피할 수 있다고 생각하게 만들었고 지금은 대신 쿼리를 사용하고있다.잠시 동안 좋은 설명을 찾을 수는 없지만, 따라 오는 사람들은 임의의 SQL 문에 앨리어싱이 필요하거나 NHibernate는 열이 부모 테이블에 속해 있다고 가정하고 그러한 테이블을 별칭으로 사용합니다. 나는 또한 당신 주위에 큰 따옴표를 사용해야한다는 많은 사람들을 보았다. 따라서 나는 (CodeSet에서 CodeSet.CodeSet을 선택하십시오. CodeSet.ViewName = 'FormControl') 완벽하게 작동합니다. –

관련 문제