Frage

Ich habe ein Szenario, das ich einige Standardeigenschaften meiner Entitäten hinzufügen möchten. Was bedeutet, dass ich habe zum Beispiel 1 und 2 int String Eigenschaften angewendet auf alle relevanten Einheiten. Ich habe mehr als 100 Mapping-Dateien und die meisten, aber nicht alle werden Hosts auf diese neuen Eigenschaften sein. In den Klassen ist es einfach, dies zu definieren; keinen Hinweis andere als ein Dienstprogramm oder Xslt Erstellung und Anwendung in den Abbildungen aber ich, dass ( Wie wiederverwendbar -Elemente in Hibernate Mapping ) definieren.

Allerdings möchte ich Eigenschaften in der Lage sein, um hinzuzufügen / zu ändern / entfernen dieser „Standard“ Mapping.

thx für alle Antworten

Edit1: ein Beispiel für die Abbildung i hinzufügen möchten

<property name="TimeOfEdit" column="TimeOfEdit" type="DateTime" not-null="true"/>
<many-to-one name="EditedBy" column="FK_EditedBy" cascade="save-update" not-null="true" />

Edit2: Ich entfernte die akzeptierte Lösung, da mit NH 2.1.1 XML-Entities nicht arbeiten (NH-1236) und NH einen Wurf

„DTD in diesem XML-Dokument ist verboten“
War es hilfreich?

Lösung 5

Es scheint, dass die einzige, dies zu tun, ist Dynamic Mapping zu verwenden ( http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx )

als solche, da ich habe bereits definiert eine Schnittstelle, die meine Einheiten für die neuen Eigenschaften verwenden (können sagen, IAuditable) seine nur eine Frage der den entsprechenden Code an der NH-Sitzung Initialisierung ausgeführt

Configuration cfg = new Configuration() Mappings mappings = cfg.CreateMappings(); 
foreach (var persistentClass in mappings.Classes) 
{ 
   if (persistentClass.MappedClass is IAuditable)
   {
     ...
   }
}

und dann

cfg.BuildSessionFactory();

, um es verdrahtet und einsatzbereit für etwa 85 Klassen die Auswirkungen auf die Leistung ist vernachlässigbar

Andere Tipps

Es hängt davon ab, wie diese Eigenschaften in Ihren Klassen umgesetzt werden.

Wenn sie alle definiert sind, in einem Basisklasse oder Schnittstelle , könnte man sie einmal in der Basisklasse oder Schnittstelle abzubilden und leiten union-subclass verwenden. Es gibt einige Einschränkungen. Lesen Sie dieses Kapitel in der NHibernate Dokumentation über sie.

Wenn Sie sich entscheiden, sie zusammen in eine Klasse zu setzen, können Sie sie als Benutzertyp zuordnen könnte . Dies wird zu einer Komponente ähnlich sein, aber man konnte einige Dinge wie Typnamen, Längen und andere in dem Benutzertyp angeben. Sie müssen noch jeden Spaltennamen angeben.

Es ist eine weitere Option: Sie können mit XML-Entitäten . Dies ist eine ziemlich primitive Funktion von XML, die von NHibernate unterstützt wird. Lesen Sie dieses Kapitel in der NH-Referenzdokumentation wo es erwähnt wird.

einen speziellen Code-Generator für Ihren speziellen Fall zu schaffen, ist Ihre einzige Option.

Option 1:
-Definition diese drei Eigenschaften in einer Basisklasse

-Haben Ihre Entitäten von dieser Basis erben

-Set up 'Tabelle pro Klassenhierarchie'

Option 2:

-Define diese 3 Eigenschaften als Komponente.

-Sie können in einer Datei die Zuordnung für diese drei Eigenschaften haben, die wiederverwendet wird.

Sie können einen Blick auf FluentNHibernate Es wird die Kartierungsarbeiten für Sie vereinfachen. Mit Mit Auto-Mapping können Sie nur eine abstrakte Basisklasse benötigen, um diese Eigenschaften zu definieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top