'Photo'클래스와 'Comment'클래스가 있습니다. 사진에 여러 개의 주석이 할당 될 수 있습니다.NHibernate 일대 다 삭제가 계단식이 아님
HBM 매핑 파일에서 일대 다 관계로 구성되었으며 Photo.hbm.xml 매핑 파일의 'Comments'백에 대해 cascade = "all-delete-orphan"을 설정했습니다. 내가 1 또는 그와 관련된 많은 댓글이있는 사진을 삭제하려고하면
그러나, 나는
'참조 제약 조건 "FK_Comments_Photos"와 충돌 DELETE 문'을 얻고 나는 다른 폭포의 몇 가지를 시도 내 Photo.hbm.xml의 Comments bag에 대한 옵션. 그러나 내가 설정 한 것에 관계없이 매번 같은 결과가 나타납니다. 난 그냥 사진을 삭제하고 관련 주석이 자동으로 삭제되도록 할 수 있기를 원합니다.
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" .... default-access="property" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Photo" table="Photos">
<id name="PhotoId" unsaved-value="0">
<column name="PhotoId" />
<generator class="native" />
</id>
...
<bag name="Comments" table="Comments" cascade="all-delete-orphan" order-by="DateTimePosted desc" where="Approved=1">
<key column="PhotoId" />
<one-to-many class="Comment" />
</bag>
</class>
여기
나의 코멘트 매핑 (간결성을 위해 편집)입니다 :
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" ... default-access="property" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Comment" table="Comments">
<id name="CommentId" unsaved-value="0">
<column name="CommentId"></column>
<generator class="native" />
</id>
...
<property name="Author" not-null="true" />
<property name="Body" not-null="true" />
<property name="Approved" not-null="true" />
<many-to-one name="Photo" not-null="true">
<column name="PhotoId" />
</many-to-one>
</class>
사람을합니까 여기
는 (간결함을 위해 편집) 내 사진 매핑 내가 사진을 삭제하려고 할 때 캐스케이드가 왜 일어나지 않는지에 대한 제안이있다. 그것과 관련된 ents?업데이트 : 내가 캐스케이드를 만들 수있는 유일한 방법은이 관계를 '계단식'에 대해 SQL Server 내에서 '삭제 규칙'을 구성하는 것입니다. 그렇게하면 지정하지 않아도됩니다. 내 NHibernate 매핑 내 모든 계단식 동작. 그러나 이것은 이상적인 것은 아니에요 - NHibernate 매핑 이상적으로 계단식 동작을 구성 할 수 싶습니다, 그래서 여전히 내 NHibernate 모든 알림을 복용하는 것으로 나타나지 않는 것처럼 혼란 스러워요. 캐스케이드 설정?
제안 해 주셔서 감사합니다. 방금 시도했지만 여전히 같은 문제/오류 메시지. SQL Server 내에서 기존 관계/제약 조건을 제거하면 사진 레코드 삭제가 오류없이 수행되지만 관련된 고아 레코드가 DB에 저장됩니다. 마치 SQL Server 내에서 상황이 구성되는 방식을주의 깊게 살펴보고 SQL Server 외부의 모든 계단식 설정을 무시하는 것과 같습니다. – marcusstarnes
분명히 not-null = "true"를 제거한 다음 Felice가 제안한 inverse = "true"를 추가해야합니다. 실제로 필요합니다. 그리고 마지막으로 cascade = "all-delete-orphan"을 남겨 둡니다. NHibernate가해야 할 일과 관련이 없기 때문에 SQL 서버를 망치지 않을 것입니다. 예, SQL Server에서 계단식 삭제를 추가하면 도움이 될 수 있지만이 문제는 엔티티 매핑 파일을 올바르게 구성하면 해결할 수 있습니다. 그래서 내가 당신이라면 서버에서 SQL 제약 조건을 제거하고 매핑 파일에 대한 위 권장 사항을 다시 시도하십시오. – tolism7
추가 정보 tolism7 주셔서 감사합니다. OK, 모든 SQL Server 제약 조건을 제거했습니다. 다 대일에서 not-null = "true"를 제거하고 가방에 inverse = "true"를 추가했습니다. 그러나 사진을 삭제하면 여전히 고아가됩니다. DB :( – marcusstarnes