2010-03-26 4 views
5

Lassen Sie uns zuerst aus dem Weg gehen: Ich weiß, dass SessionFactory unveränderlich ist - ich versuche, die Konfiguration zur Laufzeit zu ändern und ISessionFactory neu zu generieren.NHibernate: Wie werden Zuordnungen zur Laufzeit neu konfiguriert?

Konkret habe ich einen Kunden zugeordnet, der zur Laufzeit einige Felder zu seinem dynamischen Komponentenknoten hinzugefügt haben wird. Ich möchte so etwas wie diese

var newSessionFactory = previousConfiguration 
    .RemoveClassMapping(typeof(Customer)) 
    .AddXmlString(newMappingForCustomer) 
    .BuildSessionFactory(); 

jedoch tun, ich sehe keine offensichtliche Weise eine Zuordnung zu entfernen, ist es etwas, was ich kann die gesamte Konfiguration der regenerierenden Kurz tun?

+0

Eigentlich ist dies keine Frage Fluent NHibernate und ich würde die Abhängigkeit für die Zeit zu vermeiden, bevorzugen Einnahme zu sein, aber ich werde es nehmen, wenn es sein muss. –

Antwort

1

Es ist nicht möglich. Sie müssen die Configuration regenerieren.

Mein erster Vorschlag wäre, dass Sie eine andere Strategie für Ihr Modell wählen.

Wenn Sie jedoch bestimmt sind mit diesem :-) zu gehen, können Sie:

  • Erstellen Sie eine "teilweise" Configuration
  • serialisiert es ein MemoryStream
  • (das nicht Customer nicht enthalten)
  • Fügen Sie die „Basis“ Customer Mapping erforderlich, wenn
  • erstellen Sie die temporäre SessionFactory
  • abrufen, was Informationen Sie ne ed zur Karte Customer
  • Deserialize Ihre gespeicherten Configuration
  • die Customer Mapping hinzufügen und erstellen Sie Ihre endgültige SessionFactory
+0

Welche andere Strategie Diego? Wenn Felder zu dynamischen Komponenten hinzugefügt werden und die zugeordneten Spalten zur Laufzeit zur Datenbank hinzugefügt werden (wenn auch etwas selten), scheint es, dass das Regenerieren von SessionFactory bei weitem am einfachsten ist. –

+0

Die andere Strategie fügt zur Laufzeit keine Felder zu einer Datenbank hinzu. Behalten Sie stattdessen eine separate Tabelle mit Ihren benutzerdefinierten Attributdefinitionen und eine andere mit Ihren benutzerdefinierten Attributwerten bei. –

+0

Ja, das ist, was ich ursprünglich auch vorgeschlagen habe, aber diese Strategie tötet sowohl die Performance als auch die Legacy-Kompatibilität, nicht wahr? Ich bin ein wenig überrascht, dass NH nicht mit diesem Szenario entworfen wurde. Es ist nicht so selten. Ich verstehe sicherlich, dass die Unveränderlichkeit von SessionFactory wichtig ist, aber wen interessiert es, wenn die Configuration-Klasse ein Dutzend verschiedene Arten aufgeteilt wird, wenn Sie die Factory sowieso regenerieren wollen. –