2008-09-28 5 views
8

IList로 일부 속성에서 새 개체 컬렉션이 포함 된 새 개체가 있습니다. 나는 SQL 프로파일 러를 실행하는 두 개의 삽입 쿼리를 통해 볼 수 있습니다 .. 하나는 부모를 참조하는 자식에 대한 foreign-key는 빈 GUID입니다. 여기에 부모 내 매핑 :왜 내 NHibernate 가방 콜렉션이 아이들의 '부모 ID'를 동적으로 설정하지 않습니까?

<id name="BackerId"> 
    <generator class="guid" /> 
</id> 
<property name="Name" /> 
<property name="PostCardSizeId" /> 
<property name="ItemNumber" /> 

<bag name="BackerEntries" table="BackerEntry" cascade="all" lazy="false" order-by="Priority"> 
    <key column="BackerId" /> 
    <one-to-many class="BackerEntry" /> 
</bag> 

Backer.cs 클래스에, 나는이

IList<BackerEntry> 

나는 엔티티로 전달 될 saveOrUpdate하려고으로 BackerEntries 속성을 정의 나는 SQL에서 다음과 같은 결과를 얻을 수 프로파일 러 :

exec sp_executesql N'INSERT INTO 백커 (이름, PostCardSizeId, ItemNumber, BackerId) VALUES (@ p0, @ p1, @ p2, @p3), N '@ p0 nvarchar (3), @ p1 uniqueidentifier , @ p2 nvarchar (3), @ p3 uniqueidentifier ', @ p0 = N'qaa', @ p1 = 'BC95E7EB-5EE8-44B2-82FF3 0F5176684D '@ P2 = N'qaa', @ P3 = '18FBF8CE-FD22-4D08-A3B1-63D6DFF426E5'

간부 sp_executesql을 N'INSERT INTO BackerEntry (BackerId, BackerEntryTypeId, 이름, 설명, 최대 길이, 애드 팍, 우선 순위 , BackerEntryId) N '@ p0 uniqueidentifier, @ p1 uniqueidentifier, @ p2 nvarchar (5), @ p3', P3, P4, P5, P6) nvarchar (5), @ p4 int, @ p5 비트, @ p6 int, @ p7 uniqueidentifier ', @ p0 ='00000000-0000-0000-0000-000000000000 ', @ p1 ='2C5BDD33-5DD3-42EC-AA0E-F1E548A5F6E4 ', @ p2 = N'qaadf', @p3 = N'wasdf ', @p4 = 0, @p5 = 1, @p6 = 0, @p7 ='FE9C4A35-6211-4E17-A75A-60CCB526F1CA '

보시다시피, 자식의 BackerId에 대한 빈 guid가 부모의 새 실제 가이드로 재설정되지 않습니다.

마지막으로, 예외 던지기는 다음과 같습니다

"NHibernate.Exceptions.GenericADOException: could not insert: [CB.ThePostcardCompany.MiddleTier.BackerEntry][SQL: INSERT INTO BackerEntry (BackerId, BackerEntryTypeId, Name, Description, MaxLength, IsRequired, Priority, BackerEntryId) VALUES (?, ?, ?, ?, ?, ?, ?, ?)] ---\u003e System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint 

편집 :이 해결! 아래의 첫 번째 대답은 나를 올바른 방향으로 가리켰다. 나는 자식 매핑과 클래스에 그 역 참조를 추가해야했습니다. 이것으로 순전히 .net 방식으로 작동 할 수있었습니다. 그러나 json을 수락 할 때 연결이 끊어 지므로 아이들을 '다시 부착'하기 위해 기발한 코드를 만들어야했습니다.

답변

9

당신은 당신의 매핑 클래스에-NULL NOT = "true"로 추가해야 할 수 있습니다 :

<bag name="BackerEntries" table="BackerEntry" cascade="all" lazy="false" order-by="Priority"> 
    <key column="BackerId" not-null="true"/> 
    <one-to-many class="BackerEntry" /> 
</bag> 

뿐만 아니라 당신은 자식 클래스에 대해 정의 된 매핑의 역이 있는지 확인하십시오 :

<many-to-one name="parent" column="PARENT_ID" not-null="true"/> 

부모 - 자식 관계가있는 현재 프로젝트에서 최대 절전 모드와 비슷한 문제가 있었지만 해결책의 일부였습니다.

+0

고맙습니다. 올바른 방향으로 나를 가리켰습니다 ... 제 자식 매핑에 백 레퍼런스가 없었습니다. – EvilSyn

0

나는이 문제가 있었고 알아내는 데 영원히 걸렸다. 하위 테이블에서 상위 외래 키에 대해 null을 허용해야합니다. Hibernate는 foreign 키 컬럼에 NULL을 가진 자식들을 저장하고, 다시 돌아가서 올바른 ParentId로 갱신하는 것을 좋아한다.

+1

이것이 사실입니까? – Dan

+1

분명히 사실이 아니라면 반대쪽 끝이 부모이고 양면에 속성이 설정되도록 양방향 연결을 매핑해야합니다. http://www.nhforge.org/doc/nh/en/index.html#collections- bidirectional – dotjoe

+0

+1. 그래 이건 사실이야. 이 작업을 수행하려면 하위 테이블의 FK 열을 Null 할 수 있어야합니다.NHibernate는 ParentID가 NULL 인 자식을 추가 한 다음 Parent가 실제로 데이터베이스에 저장 될 때 ParentID를 업데이트합니다. –