2009-07-05 11 views
1

Ich habe ein Problem mit Viele-zu-Viele-Zuordnung mit NHibernate. Grundsätzlich habe ich zwei Klassen in meinem Objektmodell (Scenario und Skill), die auf drei Tabellen in meiner Datenbank (Scenario, Skill und ScenarioSkill) abbilden. Die Tabelle "ScenarioSkills" enthält nur die IDs der SKill- und Szenariotabelle (SkillID, ScenarioID).NHibernate-Viele-zu-Viele-Zuordnung

Im Objektmodell verfügt ein Szenario über einige allgemeine Eigenschaften und eine Liste verknüpfter Fähigkeiten (IList), die aus der Tabelle ScenarioSkills abgerufen werden. Es gibt keine verknüpfte IList of Scenarios für das Skill-Objekt.

Die Abbildung von Szenario und Fähigkeit zu ScenarioSkill ist eine many-to-many-Beziehung:

Szenario * --- * ScenarioSkill * --- * Geschicklichkeit

ich die Listen als Beutel kartiert aus weil ich glaube, dass dies die beste Option ist, um aus dem, was ich gelesen habe, zu verwenden. Die Zuordnungen sind wie folgt:

Im Szenario Klasse

<bag name="Skills" table="ScenarioSkills"> 
    <key column="ScenarioID" foreign-key="FK_ScenarioSkill_ScenarioID"/> 
    <many-to-many class="Domain.Skill, Domain" column="SkillID" /> 
</bag> 

Und innerhalb der Fähigkeit Klasse

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

Alles funktioniert gut, außer wenn ich versuche, eine Fähigkeit zu löschen, kann es nicht so tun Es gibt eine Referenzbeschränkung für die Spalte "SkillID" der Tabelle "ScenarioSkill". Kann mir jemand helfen?

Ich verwende NHibernate 2 auf einer C# asp.net 3.5 Web-Anwendungslösung.

Antwort

1

Bis spät auf die endgültige Antwort hier, aber dies ist die Zuordnung, die ich erfolgreich umgesetzt habe.

In Szenario

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

In Geschicklichkeits

1

Wenn ich die Frage nicht richtig lese, müssen Sie die zugehörigen ScenarioSkills löschen, bevor Sie eine Fertigkeit oder ein Szenario löschen. Es ist ziemlich geradlinig, Sie benötigen nur eine benutzerdefinierte Methode zum Löschen der Related ScenarioSkill-Objekte, bevor Sie den übergeordneten Datensatz löschen.

Möchten Sie, dass es automatisch gelöscht wird?

+1

Ich sehe, was sich hier sagen, und ja, ich könnte eine benutzerdefinierte Methode für das Lösch enthalten - ich hatte gehofft, dass ich es durch die Zuordnung umgehen konnte Verwenden Sie jedoch die Kaskadeneinstellung. Scheint aber ein Schmerz der Hintern zu sein. – Scozzard

1

Sie sollten cascade="all-delete-orphan" auf Skills viele-zu-viele Verknüpfung mit ScenarioSkills setzen. Wie es sich anhört, wird es die verwaisten Datensätze löschen und verhindern, dass dieser Fehler auftaucht.

Als eine Randnotiz sollten Viele-zu-Viele mit Vorsicht verwendet werden. Die meisten Many-to-Manys enthalten andere Informationen in der Beziehung und sind besser als eine Reihe von Man-zu-Manys abgebildet.

+0

Ich habe cascade = "all-delete-orphan" vergebens gesetzt - bekomme immer noch den Referenz Contraint Fehler in der SkillID Spalte der ScenarioSkill Tabelle ... Der Fehler wird beim Aufruf von Session.Delete ("from Skill s "); – Scozzard