2009-07-05 212 views
1

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

在对象模型中,场景具有几个常规属性和从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 web应用程序解决方案上使用NHibernate 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> 

在技能

1

除非我错误地阅读问题,否则在删除技能或方案之前需要删除相关的ScenarioSkills。它非常直观,您只需要一个自定义方法即可在删除父记录之前删除相关的ScenarioSkill对象。

你想让它自动删除吗?

+1

我看到你说的话在这里,是的,我可能包括用于删除自定义方法 - 我希望我可以通过映射处理它尽管使用级联设置。似乎被证明是一个痛苦的屁股虽然。 – Scozzard 2009-07-06 01:59:00

1

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

作为一个侧面说明,多对多应谨慎使用。大多数男士在这种关系中包含其他信息,并且更好地映射为一对一的男士。

+0

我设置cascade =“all-delete-orphan”无效 - 仍然在ScenarioSkill表的SkillID列上得到参考约束错误... 调用Session.Delete时出现错误(“from Skill s “); – Scozzard 2009-07-06 02:02:58