2011-03-31 6 views
0

비슷한 질문이 있지만, 답변을 찾을 수 없습니다. 나는 다음과 같은 유창함 관계를 매핑 한 : 나는 비록 부모 (필터 개체를) 삭제하려고하면Fluent NHibernate Cascade Delete Error

HasMany<UserFilter>(x => x.UserProjectFilters) 
      .KeyColumns.Add("UserProfileID") 
      .Cascade.All() 
      .AsSet() 
      .Inverse() 
      .Cache.ReadWrite(); 

가, 삭제는 계단식으로하지 않습니다; 예외가 표시됩니다 : "DELETE 문이 REFERENCE 제약과 충돌했습니다 ...". NH 프로파일 러에서 Delete 문은 부모에 대해 생성되지만 자식에 대해서는 생성되지 않습니다. 나는 모든 자식에 대한 삭제가 부모보다 먼저 수행되기를 기대합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

다음 관계의 UserProfileFilter 끝입니다 :

References<Filter>(x => x.Filter) 
      .Column("FilterID") 
      .LazyLoad() 
      .Cascade.SaveUpdate(); 

감사합니다! 앤디

+1

보십시오. 관계를 단순화하면 문제를 해결하는 데 도움이 될 수 있습니다. SQL을 보면 부모 (필터)를 먼저 삭제하려고합니까? –

답변

1
이 자식 테이블에 여러 외래 키 문제, 잘못된 키 었죠

과 관계를 설정 한대로 매핑에 사용 된 Cascade.AllDeleteOrphan() 필요하다고 생각 . 나는 다음에 위의 코드를 변경하고 그냥 괜찮 았는데 :

HasMany<UserFilter>(x => x.UserProjectFilters) 
      .KeyColumns.Add("FilterID") 
      .Cascade.All() 
      .AsSet() 
      .Inverse() 
      .Cache.ReadWrite(); 

가 도움 데이비드 주셔서 감사합니다! 필터 및 그 무엇을보기 위해 아이의 기준에 .Cascade.SaveUpdate()를 복용

앤디

1

난 당신이 Inverse()

+0

빠른 답장을 보내 주셔서 감사합니다.하지만 불행히도 이것은 작동하지 않았습니다. NH 예외가 발생했습니다 : "배치 쿼리를 실행할 때 예외가 발생했습니다"그리고 불행히도 innerexception이 없습니다. 이것은 AllDeleteOrphan을 제외하고는 내가 본 것과 같은 예외이며, InnerException이 없으므로 외래 키 위반을 나타냅니다. – Andy

+1

이상한 설정 인 것 같습니다. 대개 M 대 1 관계의 양 끝이 계단식으로 연결되어 있지 않습니다. 직접 스키마를 생성 했습니까? 아니면 NHibernate가 스키마를 작성 했습니까? –

+0

스키마를 수동으로 생성했습니다. 자식 컬렉션 매핑에서 Cascade.SaveOrUpdate를 제거하면 "DELETE 문이 REFERENCE 제약 조건과 충돌했습니다 ..."오류가 계속 표시됩니다. 다른 생각? – Andy