내 nhibernate bag 컬렉션이 어린이의 '부모 ID'를 동적으로 설정하지 않는 이유는 무엇입니까?
-
02-07-2019 - |
문제
나는 일부 속성에 ILIST로 새로운 개체가있는 새로운 객체를 가지고 있습니다. SQL Profiler Two Insert Queries가 실행되는 것을 보았습니다. 새로운 Guid 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 클래스에서 Backerentries 속성을 다음과 같이 정의했습니다.
IList<BackerEntry>
전달 된 엔티티에서 저장하려고 할 때 SQL 프로파일 러에서 다음과 같은 결과를 얻습니다.
exec sp_executesql n'Insert into Backer (이름, 엽서, 항목, 뒷이야기) 값 (@p0,@p1,@p2) ', n'@p0 nvarchar (3),@p1 고유 한 식별기,@p2 nvarchar (3) ),@p3 고유 한 핵심기 ',@p0 = n'qaa',@p1 = 'bc95e7eb-5ee8-44b2-82ff30f5176684d',@p2 = n'qaa ',@p3 ='18fbf8ce-fd22-4d08-a3b1-63d6dff426e5 '5 '
exec sp_executesql n'Insert recconerentry (뒷이야기, 뒷이야기, 뒷이야기, 이름, 설명, maxlength, isrequired, 우선 순위, backerentryid) 값 ( @p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7) ', n'@p0 고유 한 식별기,@p1 고유 한 식별기,@p2 nvarchar (5),@p3 nvarchar (5),@p4 int,@p5 bit,@p6 int,@p7 고유 한 식별기 ',@p0 ='000000-0000 -0000-0000-0000000000 ',@P1 ='2C5BDD33-5DD3-42EC-AA0E-F1E548A5F6E4 ',@P2 = N'QAADF',@P3 = N'WASDF ',@P4 = 0,@P5 = 1,@ p6 = 0,@p7 = 'Fe9c4a35-6211-4E17-A75A-60CCB526F1CA'
보시다시피, 아이에 대한 뒷면에 대한 빈 안내서를 부모의 새로운 진정한 안내에 재설정하지 않습니다.
마지막으로 예외 던지기는 다음과 같습니다.
"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을 수락 할 때 연결이 끊어져 어린이들을 '다시 해치기 위해'기발한 코드를 만들어야했습니다.
해결책
매핑 클래스에 null = "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"/>
현재 프로젝트에서 부모-자식 관계를 가진 현재 프로젝트에서 동면과 비슷한 문제가 있었으며 이는 해결책의 일부였습니다.
다른 팁
나는이 문제가 있었고 알아내는 데 영원히 걸렸다. 어린이 테이블은 부모의 외국 키에 널을 허용해야합니다. nhibernate는 외국 키 열에 null이있는 어린이들을 구한 다음 돌아가서 올바른 부모로 업데이트하는 것을 좋아합니다.