2011-09-28 2 views
1

오류는 일반적이지만 상황에 맞는 답변을 찾을 수없는 시나리오는FluentNHibernate를 사용하여 참조 된 개체를 삭제하는 방법 (예 : 삭제 된 개체가 계단식으로 다시 저장 됨)

입니다.

엔티티 :

학교 교사 학생

매핑 :

School: mapping.HasMany(x => x.Students).Cascade.AllDeleteOrphan(); 
Student: 
     mapping.References(x => x.Teacher).Not.Nullable().Cascade.SaveUpdate(); 
     mapping.References(x => x.School).Not.Nullable().Cascade.SaveUpdate(); 
Teacher: 
     mapping.References(x => x.School).Not.Nullable().Cascade.SaveUpdate(); 
     mapping.HasMany(x => x.Students).Cascade.All().Inverse(); 

시나리오 : 학생은 다른 학생이나 교사가없는 학교와 연결되어 있습니다. 학생과 다른 학교를 연결하고 싶으면 고아 학교를 삭제하고 싶습니다. 여기에 어떻게됩니까

if (oldSchool.Students.Count == 1 && oldSchool.Teachers.Count == 0) 
{ 
    //delete it 
    //oldSchool.Students.Remove(student); 
    student.School = null; 

    _schoolRepository.Delete(oldSchool); 
} 

내가 "학생"저장 갈 때, 나는 지칠대로 지친 오류 "삭제 된 개체가 계단식으로 다시 저장 될 것이다"얻을 것입니다.

언제나처럼, 어떤 도움도 크게 감사하겠습니다.

답변

0

나머지 매핑은 어떻게됩니까? 학교와 학생 사이의 반대 설정은 무엇입니까?

시도 mapping.HasMany(x => x.Students).Cascade.AllDeleteOrphan().Inverse()

+0

이러한 클래스를 포함하는 매핑의 전체입니다. Inverse가 References 시나리오에서 HasMany/HasOne 시나리오와 비교하여 어디로 갈지는 명확하지 않습니다. 그것을 시도 할 것입니다. – sydneyos

+0

사실, 여기가 내가 넘어 졌을 때입니다 - 참조에는 Cascade.AllDeleteOrphan 옵션이 없으며 Inverse() 옵션도 없습니다. – sydneyos

+0

맞습니다. 게시하기 전에 꼭 psuedo 코드를 확인 했어야합니다 - 일반적으로 References 끝에 Inverse를 두지 마십시오 - mapping.HasMany (x => x.Students)면에 있어야합니다. AllDeleteOrphan에 관해서는 당신이 내가 볼 수있는 것과 똑같은 것을 가지고 있습니다. 할 수있는 한 가지 방법은 실제 매핑 파일을 내보내고 작업 할 때까지 조정 한 다음 FNH로 비틀어 진 파일을 내보내는 방법을 파악하는 것입니다. 이 의견을 반영하기 위해 내 대답을 업데이트했습니다. – rbellamy

관련 문제