1

NHibernateを使用した多対多のマッピングに問題があります。基本的に、オブジェクトモデルには2つのクラス(ScenarioとSkill)があり、データベースの3つのテーブル(Scenario、Skill、ScenarioSkill)にマッピングされています。SequenceSkillsテーブルは、SKillおよびScenarioテーブルのID(SkillID、ScenarioID)を保持するだけです。

オブジェクトモデルでは、シナリオにはいくつかの一般的なプロパティと、ScenarioSkillsテーブルから取得される関連スキルのリスト(IList)があります。Skillオブジェクトに関連付けられたシナリオのIListはありません。

シナリオとスキルからシナリオスキルへのマッピングは、多対多の関係です。

シナリオ*---*シナリオスキル*---*スキル

これが私が読んだものから使用するための最良のオプションであると信じているので、私はリストをバッグとしてマップしました。マッピングは次のとおりです。

シナリオクラス内

<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.net3.5WebアプリケーションソリューションでNHibernate2を使用しています。

4

3 に答える 3

1

質問を間違って読んでいない限り、スキルまたはシナリオを削除する前に、関連するScenarioSkillsを削除する必要があります。これは非常に簡単です。親レコードを削除する前に、関連するScenarioSkillオブジェクトを削除するカスタムメソッドが必要です。

自動的に削除しますか?

于 2009-07-05T23:33:03.253 に答える
1

cascade="all-delete-orphan"スキルをScenarioSkillsに多対多でリンクするように設定することをお勧めします。聞こえるように、孤立したレコードを削除し、そのエラーがポップアップしないようにします。

ちなみに、多対多は注意して使用する必要があります。ほとんどの多対多は、関係に他の情報を含み、1対多のセットとしてより適切にマッピングされます。

于 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 に答える