1

我在使用 NHibernate 进行多对多映射时遇到问题。基本上我的对象模型中有 2 个类(场景和技能)映射到数据库中的三个表(场景、技能和场景技能)。ScenarioSkills 表只保存 SKill 和 Scenario 表的 ID(SkillID、ScenarioID)。

在对象模型中,Scenario 有几个通用属性和一个从 ScenarioSkills 表中获得的相关技能列表 (IList)。Skill 对象没有关联的 IList of Scenarios。

从 Scenario 和 Skill 到 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。

4

3 回答 3

1

除非我读错了问题,否则您需要在删除技能或场景之前删除相关的场景技能。这非常简单,您只需要一个自定义方法来删除相关的 ScenarioSkill 对象,然后再删除父记录。

你想让它自动删除吗?

于 2009-07-05T23:33:03.253 回答
1

您需要设置cascade="all-delete-orphan"技能多对多链接到 ScenarioSkills。就像听起来一样,它将删除孤立的记录并防止该错误弹出。

附带说明一下,应该小心使用多对多。大多数多对多包含关系中的其他信息,并且更好地映射为一组一对多。

于 2009-07-05T23:39:42.773 回答
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>
于 2010-07-01T21:49:11.427 回答