2

Ich verwende Fluent NHibernate und muss jetzt mit archivierten Daten arbeiten, wobei die gleiche Tabelle in mehreren MSSQL-Datenbanken vorhanden ist. Abhängig von einem vom Benutzer angegebenen Date-Wert muss ich mich mit einer anderen Datenbank verbinden, während alle Mapping-Informationen gleich bleiben.Switching Database für die gleiche gemappte Tabelle

Spezifischer: Wenn der angegebene Datumswert innerhalb des aktuellen Jahres liegt, verwenden Sie DB CUR, andernfalls verwenden Sie eine jährliche DB (2011, 2010, 2009, ...).

Jetzt gab es eine Zeit, als Leute mir erzählten, dass eine SessionFactory immer wieder neu zu erstellen ziemlich teuer ist, also dachte ich mir, dass es eine Möglichkeit gibt, die vorhandene sessionFactory, Update my ClassMap, zu verwenden (etwas wie Änderung Schema von "CUR.DBO" zu "2011.BO") und wiederverbinden.

Ich habe versucht, Chaos mit beiden FluentConfiguration und Session, aber dann nahm ich einen Pfeil im Knie nicht einen Weg finden könnte die Zuordnungen zur Laufzeit zu aktualisieren.

Erstelle ich am Ende eine neue SessionFactory? Oder kennt jemand da draußen ein praktikables Verfahren, um Fluent-NHibernate-Mappings zur Laufzeit neu zu initialisieren?

EDIT: Ein sehr wichtiges Detail, die SqlConnection wird auch extern zur Verfügung gestellt. Es bietet Zugriff auf alle Datenbanken, was bedeutet, dass ich theoretisch nie Verbindungen erstellen muss. Also muss ich im Grunde eine SessionFactory für jedes Archiv erstellen, um die Informationen des Mapping-Schemas zu aktualisieren und auf eine andere Datenbank zu zeigen. Aber genau hier stecke ich fest.

+1

Warum nicht 2 Session-Fabriken erstellen? Eine für die Archivdatenbank und eine für die Produktionsdatenbank. –

+0

Wir haben ein Archiv pro Jahr, also würde ich am Ende mindestens 10 erstellen.Das ist im Grunde, was ich wissen muss, aber hoffentlich gibt es einen klügeren Weg ... –

Antwort

1

Vielen Dank für Ihre Antworten/Kommentare. Tatsächlich habe ich keine Möglichkeit gefunden, die Sitzungs-Factory wiederzuverwenden, also habe ich eine Suchliste für sie erstellt, wie vorgeschlagen. Die folgende Lösung tut, was ich brauche (die Datenbank ändern), werden wir, wie er ausführt:

private IDictionary<string, ISessionFactory> _sessionFactories; 

    public SqlConnection Connection { get; set; } 

    public ISessionFactory GetSessionFactory(string dbName) 
    { 
     if (_sessionFactories.ContainsKey(dbName)) 
     { 
      return _sessionFactories[dbName]; 
     } 

     FluentConfiguration cfg = Fluently.Configure().Database(MsSqlConfiguration.MsSql2008 
                   .ShowSql() 
                   .ConnectionString(c=>c.Is(Connection.ConnectionString))) 
                 .Mappings(x=>x.FluentMappings.Add<MappedClassMap>()); 
     cfg.ExposeConfiguration(x => x.GetClassMapping(typeof(MappedClass)).Table.Schema = string.Format("{0}.dbo",dbName)); 
     ISessionFactory sf = cfg.BuildSessionFactory(); 
     _sessionFactories.Add(dbName, sf); 
     return sf; 
    } 
1

Es stimmt, dass das Erstellen einer Sitzungsfactory eine wesentlich teurere Operation als das Erstellen einer Sitzung ist, sodass Sie sicher keine für jede einzelne Abfrage zu einer Datenbank erstellen möchten.

Allerdings dauert es meiner Erfahrung nach nur wenige Sekunden.

Ich würde vorschlagen, dass Sie jedes Mal ein neues erstellen, wenn die Benutzer ein anderes Jahr auswählen. Wenn Sie ihnen ein gutes Feedback geben, während dies geschieht (vielleicht ein Dialog, der etwas wie "Verbinden mit 2010-Datenbank" mit einem Fortschrittsbalken sagt), werden sie wahrscheinlich nichts gegen das Warten haben.

Und sobald Sie eine für ein Jahr erstellt haben, können Sie sie erneut verwenden, wenn sie im selben Jahr mehr Abfragen durchführen, sodass sie nur einmal pro Jahr abgefragt werden müssen.

Wenn die Erstellung der Sitzungsfactory zu lange dauert, habe ich Beiträge gesehen, die erklären, wie die Konfiguration gespeichert oder zwischengespeichert wird, um die Erstellungszeit zu reduzieren. Allerdings hat eine schnelle Google keine guten Links, so dass Sie dies möglicherweise recherchieren müssen, oder eine andere Frage stellen.

0

Es scheint, die es genügt, wenn die Session für einen einzelnen db erstellt wird. Aber beim Öffnen einer Sitzung mit der Sessionfactory-Instanz ist eine überladene Methode verfügbar, um das dbconnection-Objekt anzugeben, mit dem wir die DBs wechseln können. Habe es verifiziert und es funktioniert gut.