Domanda

Ho uno scenario che voglio aggiungere alcune proprietà standard per i miei soggetti. Il che significa che avrò esempio 1 int e 2 proprietà di stringa applicate a tutte le entità rilevanti. Ho più di 100 file di mapping e la maggior parte, ma non tutti saranno ospiti a queste nuove proprietà. Nelle classi sua facile definire questo; nelle mappature però non ho trovato alcun riferimento diverso rispetto alla creazione di un programma di utilità o XSLT e l'applicazione che ( Come definire riutilizzabili elementi in ibernazione mappatura ).

Tuttavia voglio essere in grado di aggiungere / modificare / rimuovere oggetti di questa mappatura "standard".

thx per le eventuali risposte

Edit1: un esempio della mappatura voglio aggiungere

<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: Ho rimosso la soluzione accettata perché con NH 2.1.1 entità XML non funzionano (NH-1236) e NH getteranno un "DTD è vietata in questo documento XML"

È stato utile?

Soluzione 5

Sembra che l'unico a fare questo, è quello di utilizzare mapping dinamico ( http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx )

in quanto tale, dal momento che ho già definito un'interfaccia che i miei soggetti potranno utilizzare per la nuova proprietà (diciamo IAuditable) la sua solo una questione di esecuzione il codice appropriato durante l'inizializzazione NH-session

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

e quindi

cfg.BuildSessionFactory();

di averlo cablato e pronto per essere utilizzato per circa 85 classi l'impatto sulle prestazioni è trascurabile

Altri suggerimenti

Dipende da come queste proprietà sono implementati nelle classi.

Se sono tutti definiti in un classe base o interfaccia , si potrebbe mappare una volta nella classe base o l'interfaccia, e derivare usando union-subclass. Ci sono alcune limitazioni. Leggere questo capitolo nella documentazione di NHibernate su di esso.

Se si decide di metterli insieme in una classe, li si potrebbe mappare come un tipo di utente . Questo sarà simile a un componente, ma si potrebbe specificare alcune cose come i nomi dei tipi, lunghezze e altri nel tipo di utente. Hai ancora bisogno di specificare ogni nome di colonna.

C'è un'altra opzione: si può usare entità XML . Questa è una caratteristica piuttosto primitiva da XML che è supportato da NHibernate. Leggere questo capitolo nella documentazione di riferimento NH in cui è menzionato.

La creazione di un generatore di codice speciale per il vostro caso specifico è l'unica opzione.

Opzione 1:
-Definire questi 3 immobili a una classe di base

-hanno tuoi entità ereditano da questa base

-set up 'tabella per gerarchia di classe'

Opzione 2:

Consente di definire questi 3 proprietà di un componente.

-Si può avere la mappatura per questi 3 immobili a un file che viene riutilizzato.

Si potrebbe dare un'occhiata a fluentNHibernate , si semplificherà il lavoro di mappatura per voi. Con Con la mappatura automatica si può solo bisogno di una classe astratta di base per definire queste proprietà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top