2009-03-02 6 views
2

Ich habe folgendes Objektmodell:NHibernate Mapping Probleme

  • Ein Top-Level-abstrakte Klasse Element mit vielen Kindern und Nachkommen.
  • Eine Klasse Event.
  • Jede Element enthält eine Tasche von Event s.
  • Jedes Event hat einen Zeiger auf das übergeordnete Element.

Bis jetzt - ziemlich standart one-to-many Beziehung.

Aber ich möchte Tabelle pro konkrete Klassenstrategie verwenden. Daher ist die Klasse Element nicht der Datenbank zugeordnet. Ich habe versucht, es auf diese Weise zu lösen: jeder der konkreten Nachkommen von Element definiert seine eigene Tasche von Event s. Das Problem dabei ist, dass jedes <bag> Element ein <key> Element enthält. Dieser Schlüssel verweist auf die Parent Eigenschaft von Event. Es macht auch die Parent Spalte in der Event s Tabelle einen Fremdschlüssel zu der Tabelle, die den Bag enthält! Aber eine Spalte kann kein Fremdschlüssel für mehrere Tabellen sein und ich bekomme eine Ausnahme beim Einfügen.

Ich habe auch versucht, das Parent Feld in der Event s Tabelle ein Viel-zu-eine Art Feld zu machen. Das hat funktioniert. Aber wenn ich die Beziehung bidirektional machen will, also die Taschen den Nachkommen von Element hinzufügen, komme ich auf das gleiche Problem zurück. Bag => Fremdschlüssel => Ausnahme beim Einfügen.

Ich bin sicher, dass dieser Fall nicht so einzigartig ist, wie es scheint. Vielen Dank im Voraus für Ihre Hilfe.

Antwort

1

Ein bisschen spät, aber ich habe einige beraten.

Wenn Sie "Tabelle pro konkrete Klasse" verwenden, ist es so, als würden Sie vollständig unabhängige Tabellen zuordnen. Sie brauchen also separate Fremdschlüssel oder Viele-zu-Irgendein.

many-to-any speichert den Typnamen und NH weiß, wo der Fremdschlüssel zeigt. Aber es ist unmöglich, Beschränkungen für einen solchen Fremdschlüssel zu haben.

Wenn Sie mehrere Taschen mit Artikel des gleichen Typs haben, stellen Sie sicher, dass sie alle verschiedene Fremdschlüssel zu definieren:

<class name="A"> 
    <!-- ... --> 
    <bag name="Events"> 
    <key column="A_FK"/> 
    <one-to-many class="Event"/> 
    </bag> 
</class> 

<class name="B"> 
    <!-- ... --> 
    <bag name="Events"> 
    <key column="B_FK"/> 
    <one-to-many class="Event"/> 
    </bag> 
</class> 

Sie Fremdschlüssel-Constraints auf einer solchen Fremdschlüssel haben, aber keine nicht-NULL-Constraint , weil nur einer dieser Fremdschlüssel verwendet wird.

Um wirklich nur einen Fremdschlüssel mit allen Einschränkungen zu haben, müssen Sie das Element einer separaten Tabelle zuordnen.