2009-12-16 6 views
0

나는 NHibernate를 배우고있다. 설명서의 예제와 여기 stackoverflow에서 예제를 사용했지만 뭔가를 놓쳤을 것입니다.NHibernate 부모 매핑이 자식 foreign-key를 생성하지 않는다

자식 컬렉션이있는 PARENT 개체가 있습니다. 자식은 부모가 없으면 의미가 없으므로 데이터베이스에는 FK가 NOT NULL로 설정됩니다. CHILD에서 PARENT로 NHibernate를 구현하는 것은 잘되지만, 나는 이러한 관계의 방향을 필요로하지 않는다.

대신에, 나는 관계를 소유하는 부모를 구현하려고하지만 지속적으로 품어 데이터베이스 오류가 "PARENT_ID에 NULL 값을 삽입 할 수 없습니다"얻을. 저장시 학부모의 ID 나 실체가 어린이에게 저장되지 않습니다.

아래 코드 샘플을 참조하십시오. 제발 조언.

클래스 파일

public class PARENT { 
    private readonly IList<CHILD> _children = new List<CHILD>(); 
    public virtual Id { get; set; } 
    public virtual void AddChild(CHILD child) { 
     _children.add(child); 
    } 
} 
public class CHILD { 
    public virtual Id { get; set; } 
} 

매핑

<class name="PARENT" table="Parent"> 
    <cache usage="read-write"/> 

    <id name="Id" column="Id" unsaved-value="0" > 
    <generator class="identity" /> 
    </id> 

    <bag name="Children" access="field.camelcase-underscore" cascade="all-delete-orphan"> 
    <key column="ParentId"/> 
    <one-to-many class="CHILD"/> 
    </bag> 

</class> 
<class name="CHILD" table="Child"> 
    <cache usage="read-write"/> 

    <id name="Id" column="Id" unsaved-value="0" > 
    <generator class="identity"/> 
    </id> 

</class> 
+0

당신이 알고 있지만 경우 확실하지, 여기 -> http://www.summerofnhibernate.com/ NHibernate에 대한 몇 가지 정말 좋은 스크린 캐스트를위한! – Perpetualcoder

답변

2

당신은 당신의 매핑 및 개체 모델에서 관계의 양쪽을 정의해야합니다. 그런 다음 매핑에서 inverse="true"으로 하나를 선언합니다.

클래스 파일

public class PARENT { 
    private readonly IList<CHILD> _children = new List<CHILD>(); 
    public virtual Id { get; set; } 
    public virtual void AddChild(CHILD child) { 
     _children.add(child); 
    } 
} 
public class CHILD { 
    public virtual PARENT Parent { get; set; } 
    public virtual Id { get; set; } 
} 

매핑

<class name="PARENT" table="Parent"> 
    <cache usage="read-write"/> 

    <id name="Id" column="Id" unsaved-value="0" > 
    <generator class="identity" /> 
    </id> 

    <bag name="Children" access="field.camelcase-underscore" 
    cascade="all-delete-orphan" inverse="true"> 
    <key column="ParentId"/> 
    <one-to-many class="CHILD"/> 
    </bag> 

</class> 
<class name="CHILD" table="Child"> 
    <cache usage="read-write"/> 

    <id name="Id" column="Id" unsaved-value="0" > 
    <generator class="identity"/> 
    </id> 
    <many-to-one name="Parent" class="PARENT" column="ParentId" /> 

</class> 

을 그리고 당신은이에하는 AddChild 방법을 변경 할 수 있습니다 : 그래서 이런 식으로 뭔가 작업을해야합니다

public virtual void AddChild(CHILD child) { 
    _children.add(child); 
    child.Parent = this; 
} 
+0

응답 해 주셔서 감사합니다. CHILD 매핑의 경우 "class"는 "property"에 대한 유효한 속성이 아닙니다. 제거를 시도했지만 부모를위한 유형을 결정할 수 없습니다. 나는 또한 "many-to-one"으로 "property"를 변경하려고 시도했지만 null 외래 키를 삽입하는 것으로부터의 나의 이전 오류로 귀결되었다. –

+0

죄송합니다. 내 머리 꼭대기에서 떨어져있었습니다. 게시물을 편집합니다. –

+0

그건 작동하지만, 여전히 "NULL 값을 PARENT_ID에 삽입 할 수 없습니다". 내 단계는 부모를 만들고, 부모를 유지하고, 플러시하고, 자식을 부모에게 추가하고, 부모를 유지하고, 오류, 울기, Stackoverflow를 시도하십시오. –

0

나는 같은 p를 가졌다. 흠, 이제는 외래 키의 이런 종류에 대해 not-null 제약 조건을 삭제했다. 데이터베이스는 NH에서만 사용되므로 null 값을 가져올 수 없습니다.

나는 NHibernate가 먼저 자식을 저장한다고 생각한다. 그런 다음 부모를 저장합니다. 아이디 아이디가 필요하기 때문에 아이디가 데이터베이스에 삽입되기 전에 부모에 대한 기본 키가 없습니다. 그 후에 아이를 업데이트해야합니다.

다른 ID 생성기를 사용해보십시오. hilo을 권장합니다. 이것은 또한 더 빠릅니다.

+0

불행히도, 데이터베이스는 두 개의 다른 클라이언트에서 활용되므로 데이터베이스에서이 무결성을 직접 유지하는 것을 선호합니다. –

관련 문제