我遇到了使用NHibernate进行多对多映射的问题。基本上我在我的对象模型(场景和技能)中有2个类映射到我的数据库中的三个表(Scenario,Skill和ScenarioSkill)。 ScenarioSkills表只保存SKill和Scenario表的ID(SkillID,ScenarioID)。
在对象模型中,Scenario具有一些常规属性和从ScenarioSkills表中获取的关联技能列表(IList)。对于技能对象,没有相关的IList of Scenarios。
从场景和技能到场景技能的映射是一种多对多关系:
场景* --- * 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 Web应用程序解决方案中使用NHibernate 2.
答案 0 :(得分:1)
除非我不正确地阅读问题,否则您需要在删除技能或场景之前删除相关的ScenarioSkills。它非常简单,您只需要一个自定义方法来删除关联的ScenarioSkill对象,然后再删除父记录。
你想让它自动删除吗?
答案 1 :(得分:1)
您需要在技能上设置cascade="all-delete-orphan"
多对多链接到ScenarioSkills。就像听起来一样,它会删除孤立的记录并防止弹出错误。
作为旁注,应谨慎使用多对多。大多数对象都包含关系中的其他信息,并且更好地映射为一组一对一。
答案 2 :(得分: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>
技能
<!-- inverse end of scenarios -->
<bag name="scenarios" access="field" inverse="true" schema="OSM" table="ScenarioSkill" cascade="none">
<key column="SkillID"
foreign-key="FK_ScenarioSkill_Skill" />
<many-to-many column="ScenarioID"
class="Scenario"
foreign-key="FK_ScenarioSkill_Scenario" />
</bag>