3

'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 모든 알림을 복용하는 것으로 나타나지 않는 것처럼 혼란 스러워요. 캐스케이드 설정?

답변

4

제 생각에 문제는 Comment 매핑의 many-to-one이 not-null = "true"로 설정되어 있기 때문에 발생합니다. 그 때문에, NHibernate는 Photo 객체를 삭제하기 전에 일시적으로이 속성을 null로 설정할 수 없으므로 사진 객체 삭제시 SQL Server가 외래 키 예외를 throw합니다. 삭제할 때 나는 행동의 순서를 제대로 기억한다면

은 다음과 같습니다

    모든 아이에 null로
  1. 설정 외래 키 값이 객체
  2. 삭제 부모 개체
  3. 모든 아이가
를 참조 삭제

many-to-one에서 not-null = "true"를 제거하고 어떤 일이 일어날 지보십시오.

+0

제안 해 주셔서 감사합니다. 방금 시도했지만 여전히 같은 문제/오류 메시지. SQL Server 내에서 기존 관계/제약 조건을 제거하면 사진 레코드 삭제가 오류없이 수행되지만 관련된 고아 레코드가 DB에 저장됩니다. 마치 SQL Server 내에서 상황이 구성되는 방식을주의 깊게 살펴보고 SQL Server 외부의 모든 계단식 설정을 무시하는 것과 같습니다. – marcusstarnes

+0

분명히 not-null = "true"를 제거한 다음 Felice가 제안한 inverse = "true"를 추가해야합니다. 실제로 필요합니다. 그리고 마지막으로 cascade = "all-delete-orphan"을 남겨 둡니다. NHibernate가해야 할 일과 관련이 없기 때문에 SQL 서버를 망치지 않을 것입니다. 예, SQL Server에서 계단식 삭제를 추가하면 도움이 될 수 있지만이 문제는 엔티티 매핑 파일을 올바르게 구성하면 해결할 수 있습니다. 그래서 내가 당신이라면 서버에서 SQL 제약 조건을 제거하고 매핑 파일에 대한 위 권장 사항을 다시 시도하십시오. – tolism7

+0

추가 정보 tolism7 주셔서 감사합니다. OK, 모든 SQL Server 제약 조건을 제거했습니다. 다 대일에서 not-null = "true"를 제거하고 가방에 inverse = "true"를 추가했습니다. 그러나 사진을 삭제하면 여전히 고아가됩니다. DB :( – marcusstarnes

2

매핑의 가방 컬렉션에 inverse="true"과 함께 시도해보십시오.

+0

나는 (그 밖의 다른 것이 효과가 없을 때) 시도했지만, 불행히도 성공하지는 못했습니다. – marcusstarnes

1

나는 1 일 동안 비슷한 문제가 있었고 .. 그것에 대해 좌절감을 느꼈다.

마지막으로 용액은 DB로 끓여졌다. 나는 '규칙 삭제' "INSERT의 UPDATE 사양"의 FK 키 제약 조건을 변경했다 : '없음 액션'에서

'캐스케이드'에 추가로 당신은 또한 '업데이트 규칙'을 설정할 수 있습니다 : '없음 액션'에서 '캐스케이드'

0

당신에 은 NH에서 삭제 캐스케이드 옵션을 지정할 수 있습니다

<bag name="Comments" cascade="all-delete-orphan" order-by="DateTimePosted desc" where="Approved=1"> 
    <key column="PhotoId" on-delete="cascade"/> 
    <one-to-many class="Comment" /> 
</bag> 

당신은 아마 그것을 반대해야한다. 그런 다음 FK_Comments_Photos 열이 지정된 곳이 궁금합니다.