2010-02-23 2 views
2

일부 부모 엔티티를 부모 합성 키의 일부로 참조하려고하지 않습니다. 전체 키가 아닌 이유는 무엇입니까? 이것은 주석 처리 된 매핑 대신 다음 매핑을 사용할 때 발생합니다.부모 엔티티 합성 키의 일부로 하위 엔티티를 참조 할 수없는 이유는 무엇입니까?

나는 다음과 같은 오류를 얻을

VolatileEventContent 테이블에서 참조 기본 키 LocationSearchView

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="JeanieMaster.Domain.Entities" assembly="JeanieMaster.Domain"> 
    <class name="LocationSearchView" table="LocationSearchView"> 

    <composite-id> 
     <key-property name="LocationId" type="Int32"></key-property> 
     <key-property name="ContentProviderId" type="Int32"></key-property> 
     <key-property name="CategoryId" type="Int32"></key-property> 
    </composite-id> 

    <property name="CompanyName" type="String" not-null="true" update="false" insert="false"/> 
    <property name="Description" type="String" not-null="true" update="false" insert="false"/> 
    <property name="CategoryId" type="Int32" not-null="true" update="false" insert="false"/> 
    <property name="ContentProviderId" type="Int32" not-null="true" update="false" insert="false"/> 
    <property name="LocationId" type="Int32" not-null="true" update="false" insert="false"/> 
    <property name="Latitude" type="Double" update="false" insert="false" /> 
    <property name="Longitude" type="Double" update="false" insert="false" /> 

    <bag name="Events" table="VolatileEventContent" where="DeactivatedOn IS NULL" order-by="StartDate DESC" lazy="false" cascade="none"> 
     <key> 
     <column name="LocationId"></column> 
     <column name="ContentProviderId"></column> 
     <!--<column name="LocationId"></column> 
     <column name="ContentProviderId"></column> 
     <column name="CategoryId"></column>--> 
     </key> 
     <one-to-many class="Event" column="VolatileEventContentId"></one-to-many> 
    </bag> 

    </class> 
</hibernate-mapping> 

그리고 VolatileEventContent 매핑 파일로 열 같은 번호가 있어야합니다 테이블에

외래 키

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="JeanieMaster.Domain.Entities" assembly="JeanieMaster.Domain"> 
    <class name="Event" table="VolatileEventContent" select-before-update="false" optimistic-lock="none"> 
    <composite-id> 
     <key-property name="LocationId" type="Int32"></key-property> 
     <key-property name="ContentProviderId" type="Int32"></key-property> 
    </composite-id> 

    <property name="Description" type="String" not-null="true" update="false" insert="false"/> 

    <property name="StartDate" type="DateTime" not-null="true" update="false" insert="false" /> 
    <property name="EndDate" type="DateTime" not-null="true" update="false" insert="false" /> 

    <property name="CreatedOn" type="DateTime" not-null="true" update="false" insert="false" /> 
    <property name="ModifiedOn" type="DateTime" not-null="false" update="false" insert="false" /> 

    <many-to-one name="Location" class="Location" column="LocationId" /> 

    <bag name="Artistes" table="EventArtiste" lazy="false" cascade="none"> 
     <key name="VolatileEventContentId" /> 
     <many-to-many class="Artiste" column="ArtisteId" ></many-to-many> 
    </bag> 
    </class> 
</hibernate-mapping> 
+0

'VolatileEventContent'의 매핑을 게시 할 수도 있습니까? –

+0

추가 매핑을 추가했습니다. –

답변

2

오류가 정확합니다. 나는 테이블과 외래 키의 생성 중에 발생하는 것처럼 들리는 오류가 발생했기 때문에 SchemaExport을 사용하여 NHibernate 매핑을 기반으로 테이블을 생성한다고 추측합니다. SchemaExport은 (코드 흩어져 설명을 참고하시기 바랍니다) 다음과 유사한 테이블을 생성 할 것입니다 :

CREATE TABLE LocationSearchView (
    LocationId int NOT NULL, 
    ContentProviderId int NOT NULL, 
    CategoryId int NOT NULL, 

    /* ...other columns... */ 

    /* Note: Generated from LocationSearchView's "composite-id" element. */ 
    PRIMARY KEY (LocationId, ContentProviderId, CategoryId) 
); 

/* Note: Table for the "Event" class. */ 
CREATE TABLE VolatileEventContent (
    LocationId int NOT NULL, 
    ContentProviderId int NOT NULL, 

    /* ...other columns... */ 

    /* Note: Generated from Event's "composite-id" element. */ 
    PRIMARY KEY (LocationId, ContentProviderId), 
    /* Note: Generated from the "key" element of LocationSearchView's Events bag. */ 
    FOREIGN KEY (LocationId, ContentProviderId) REFERENCES LocationSearchView (LocationId, ContentProviderId) 
); 

... 따라서 오류가 발생했습니다. 외래 키는 기본 키의 일부가 아닌 완전한 기본 키 또는 고유 키를 가리켜 야합니다. 전체 키는 3 칼럼이 아니라 2입니다. 2. 왜 NHibernate는 외래 키에 대해 이들 컬럼을 사용합니까? 때문에 <key> 요소의 LocationSearchViewEvents 가방입니다. <key>자식의 열을 부모으로 다시 지정합니다.

당신 (또는 NHibernate)이이 테이블에서 선택하려고 할 때 어떤 일이 일어날 지 생각해 봅시다. 다음 데이터를 가정 :

 
TABLE LocationSearchView 
LocationId ContentProviderId CategoryId 
========== ================= ========== 
1   3     5 
1   3     6 
1   4     5 
1   4     6 
2   3     5 
2   3     6 
2   4     5 
2   4     6 
 
TABLE VolatileEventContent 
LocationId ContentProviderId 
========== ================= 
1   3 
1   4 
2   3 
2   4 

"하나"LocationSearchView는 "다"Event의를 할 수 없습니다. 오히려 그것은 다른 방향 일 것입니다. 이 표가 주어지면 실제로는 일대 다 관계가 Event에서 LocationSearchView 사이에 있습니다.

나는이 문제의 정확한 해결책이 무엇인지 모르겠다. 왜냐하면 나는 무엇을 성취하려고하는지 모르지만, 이것이 정확하게 문제가 무엇인지 밝히는 데 도움이된다.

+0

Daniel의 hbm 파일은 내 테이블을 대표하고 있으며, SchemaExport를 사용하지 않고 있습니다 (무엇이든간에) LocationSearchView에 대한 이벤트의 관계입니다. –

+0

SchemaExport는 NHibernate 매핑을 기반으로 테이블을 생성하는 도구입니다. "외래 키 ... 열 수가 같아야합니다 ..."라는 메시지는 사용하는 동안 발생하는 오류처럼 들립니다. 테이블과 외래 키의 생성.이 오류에 대한 스택 추적을 제공 할 수 있습니까? 내 테이블 구조에 대한 추측이 정확하지 않습니까? 왜 내 테이블이 어떻게 생겼는지 설명하기 위해 내 대답을 업데이트 할 것입니다. –

0

나는 nhibernate를 한번도 사용하지 않았지만 매핑은 동면 모드와 매우 유사하다고 생각합니다.

일대 다 (LocationSearchView에서 많은 VolatileEventContent로) 연결이 LocationSearchView ID를 사용하는 것을 원하지 않으면 정의 할 속성 "property-ref"를 키 요소에 정의해야합니다 재산 대신 사용 :

<bag name="Events" table="VolatileEventContent" ...> 
    <key property-ref="partialId"> 
    <column name="LocationId"></column> 
    <column name="ContentProviderId"></column> 
    </key> 
    <one-to-many class="Event" column="VolatileEventContentId"></one-to-many> 
</bag> 

(열 속성이 유효 일대 태그에?)

지금 당신은 그런 그 이름의 재산, 뭔가 정의해야

<properties name="partialId" insert="false" update="false"> 
    <property name="LocationId" type="Int32" update="false" insert="false"/> 
    <property name="ContentProviderId" type="Int32" update="false" insert="false"/> 
</properties> 

이미 LocationId 및 ContentProviderId를 정의했습니다. 이 두 속성을 속성 요소 내부로 옮기면됩니다.

+0

불행히도 property-ref는 인식 된 속성이 아닙니다. ( –

0

우선 "LocationSearchView" CategoryId 열을 속성 및 Composite-id의 일부로 정의합니다. 이것은 잘못되었지만 유감스럽게도 매핑을 작성할 때 잡히지 않으며 일반적으로 객체를 쿼리 할 때 노출됩니다. 확인 IndexOutOfRangeException Deep in the bowels of NHibernate

매핑 파서가 혼란 스러울 수 있습니다. 당신은 명시 적를 many-to-onebag 요소의 class 속성을 정의하는 대신하지 않습니다

  1. : 그리고 난 좀 더 훈련 프로그래밍 방법론을 의미 당신이 반사 컨벤션에 의존 모두 당신의 매핑에 있기 때문에 혼란을 말하고 NHibernate가 클래스 정의 자체로부터 클래스 타입을 검출 할 것을 기대한다. 만일 당신이 클래스 LocationSearchView에 설정 한 경우 다음 IList<LocationSearchView> Events {get;set;} NHibernate에 정의 된 bag에 대한 LocationSearchView 클래스를 찾을 것으로 기대 따라서 당신은 열 이름에 대한 동일한 속성 이름이 컬렉션
  2. 을지도하기 위해 3 열을 필요로하는 개발이 쉬워집니다. 실제로는 한 번 또는 두 번만 만드는 매핑을 만드는 것이 더 쉽습니다.하지만 오류나 변경이 발생하면 잘못 된 것을 발견하기가 더 어려워집니다.

그래서 매핑을 더 풍부하게 만들고 CategoryId으로 언급 한 오류를 제거하고 게시물의 수업도 포함하십시오!

관련 문제