2009-07-05 6 views
1

NHibernate를 사용하여 다 대다 매핑에 문제가 있습니다. 기본적으로 내 데이터베이스 (Scenario, Skill 및 ScenarioSkill)의 세 테이블에 매핑되는 개체 모델 (Scenario and Skill)에 2 개의 클래스가 있습니다. ScenarioSkills 테이블에는 SKill 및 Scenario 테이블의 ID (SkillID, ScenarioID) 만 있습니다.NHibernate 다 대다 매핑

개체 모델에서 Scenario에는 몇 가지 일반 속성과 ScenarioSkills 테이블에서 가져온 관련 기술 (IList) 목록이 있습니다. 스킬 개체에 대한 시나리오의 IList는 없습니다.

시나리오 * --- * ScenarioSkill * --- * 스킬

내가 가방으로 목록을 매핑 한 : 다 대다 관계가

시나리오 및 ScenarioSkill에 대한 기술에서의 매핑입니다 나는 이것이 내가 읽은 것에서 사용할 최선의 선택이라고 믿는다. 다음과 같이 매핑은 다음과 같습니다

을 시나리오 클래스

<bag name="Skills" table="ScenarioSkills"> 
    <key column="ScenarioID" foreign-key="FK_ScenarioSkill_ScenarioID"/> 
    <many-to-many class="Domain.Skill, Domain" column="SkillID" /> 
</bag> 

내에서 그리고

<bag name="Scenarios" table="ScenarioSkills" inverse="true" access="noop" cascade="all"> 
    <key column="SkillID" foreign-key="FK_ScenarioSkill_SkillID" /> 
    <many-to-many class="Domain.Scenario, Domain" column="ScenarioID" /> 
</bag> 

모든 것은 내가 기술을 삭제하려고 할 때를 제외하고, 잘 작동 스킬 클래스 내에서, 그렇게 할 수 없다 ScenarioSkill 테이블의 SkillID 열에 대한 참조 제약 조건이 있기 때문입니다. 누구든지 나를 도울 수 있습니까?

C# asp.net 3.5 웹 응용 프로그램 솔루션에서 NHibernate 2를 사용하고 있습니다.

답변

1

마지막 답글에 늦게 비트가 있지만이 매핑이 성공적으로 구현되었습니다.

1

질문을 잘못 읽지 않는 한 기술이나 시나리오를 삭제하기 전에 관련 ScenarioSkills를 삭제해야합니다. 아주 간단합니다. 상위 레코드를 삭제하기 전에 관련 ScenarioSkill 객체를 삭제하기위한 맞춤 메소드가 필요합니다.

자동으로 삭제 하시겠습니까?

+1

나는 당신이 여기라고, 그래 내가 삭제에 대한 사용자 지정 방법을 포함 할 수있는 것을 볼 스킬에서 시나리오

<bag name="skills" access="field" schema="OSM" table="ScenarioSkill" cascade="none"> <key column="ScenarioID" foreign-key="FK_ScenarioSkill_Scenario" /> <!-- Skills can be soft-deleted (groan), so ignore them if they don't 'exist' anymore. --> <many-to-many column="SkillID" class="DomainModel.Skill, DomainModel" foreign-key="FK_ScenarioSkill_Skill" where="IsDeleted = 0"/> </bag> 

에서

- 난 내가 매핑을 통해 처리 할 수 ​​기대했다 캐스케이드 설정을 사용합니다. 비록 엉덩이가 아프다는 것을 증명하는 것 같습니다. – Scozzard

1

스킬의 ScenarioSkills에 대한 다 대다 연결에 cascade="all-delete-orphan"을 설정하고자합니다. 그냥 소리처럼, 그것은 고아 레코드를 삭제하고 팝업 오류에서 계속됩니다.

부수적으로, many-to-many는주의해서 사용해야합니다. 대부분의 many-to-manys는 관계에 다른 정보를 포함하고 one-to-manys의 집합으로 더 잘 매핑됩니다.

+0

cascade = "all-delete-orphan"을 아무 쓸모 없음으로 설정 했는데도 ScenarioSkill 테이블의 SkillID 열에 참조 오차 오류가 발생했습니다 ... Session.Delete ("Skill s "); – Scozzard

관련 문제