2009-11-02 6 views
3

NHibernate에서 꽤 간단한 설정에 문제가 있습니다. (저는 Fluent Nhibernate를 사용하고 있습니다)외래 키 위반을 야기하는 NHibernate many-to-many 삭제

다음과 같은 두 개의 객체가 있는데, 양방향 다 대다 매핑을 사용합니다.

프로젝트

- 카테고리 (IList의)

카테고리

- 프로젝트 (IList의) - DB에 예상대로 역은 = 사실

이 모델.

프로젝트를 삭제하려고하면 NHibernate는 다 대다 테이블에서 삭제를 수행 한 다음 예상대로 프로젝트를 삭제합니다.

그러나 범주를 삭제하려고하면 NHibernate는 외래 키 제약 조건을 위반한다는 예외를 throw합니다.

양쪽에 inverse = "true"인 실험 세트가 있지만 프로젝트 또는 카테고리 (inverse = "true"에 따라 다름)를 삭제하려고하면 예외가 throw됩니다. inverse = "true"양쪽에서 삭제가 예상대로 작동합니다. 그러나 이것은 저장 및 업데이트 할 때 두 번 항목을 유발합니다.

어디서 잘못 알 수 있습니까?

답변

3

전체 개체 그래프를 동기화하지 않을 수도 있습니까? 표시하는 스키마는 Project에 범주 모음이 있고 범주에는 프로젝트 모음이 있음을 나타냅니다. Hibernate는 당신이 당신의 객체 그래프 내에서 동기화를 유지할 것으로 기대한다. 범주 (예 :)를 삭제하려면 먼저 해당 프로젝트 컬렉션을 지우고 연관된 모든 프로젝트의 "범주"컬렉션에서 해당 범주를 제거하십시오.

+0

동기화하기 전에 컬렉션을 명시 적으로 지우지 않습니다. 이 방법이 효과가있을 지 모르지만 나는 관계의 한쪽 끝에서 왜 그렇게해야하는지 잘 모르겠습니다. 분명히 프로젝트를 제거 할 수 있어야하며 NHib는 해당 프로젝트와 관련된 다 대다 열을 지 웁니다. 객체가 묶여 있지 않아 다 대다 관계가없는 프로젝트와 범주를 가질 수 있습니다. – WDuffy

+0

기본 SQL에는 누가 관계를 소유하는지 개념이 없습니다. 양면 연관이있는 경우, Hibernate는 한쪽면의 정보 만 필요로합니다. 하이버 네이트의 구현은 저축/업데이트시 inverse = "true"로 표시된면을 무시한다고 믿는다. * 이것은 왜 한 방향으로 작동하고 다른 방향으로 작동하지 않는지 설명 할 것이다. 개체를 삭제하기 전에 매핑 테이블에서 항목을 삭제하는 것으로 무엇을하고 있는지 생각해보십시오. 여하튼 그것을 시험해보고 문제가 해결되는지 확인하십시오. – RMorrisey

+0

도움 RMorrisey에 감사드립니다. 이것은 NHIb 업데이트를 커밋하기 전에 비즈니스 로직에서 모든 관계를 수동으로 평가하고 제거해야한다는 것을 의미합니까? 나는 Cascase All/Delete 등을 다 대다 관계에서 사용할 수 없습니다. 다른 관계를 가질 수있을 때 모든 것을 제거하기 때문입니다. 나는 아직 그것을 시도 할 기회가 없었다 (너무 많은 일!). – WDuffy

관련 문제