NHibernate多对多映射

时间:2009-07-05 23:27:50

标签: c# nhibernate many-to-many

我遇到了使用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.

3 个答案:

答案 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>