2010-12-06 34 views
0

Je souhaite utiliser une session SQLite pour démo d'une application wpf; la session utilise des données de test précédemment créées et enregistrées dans un fichier de test db3. Je lie le contexte, en utilisant un code similaire à ce que j'utilise dans les tests normaux - le code de travail.nhibernate session en cours perdue après la création sur le thread d'arrière-plan

La différence ici est probablement que je construis la fabrique de session et charge les données de test sur un fil d'arrière-plan. Dans la mesure où c'est le problème, je me demande s'il y a un contexte différent de celui que j'utilise.

Je peux voir que la session contextuelle est disponible sur le thread d'arrière-plan. Le code est ci-dessous. Quelqu'un a-t-il une suggestion?

============

code fil de fond

le contexte est lié ici, et est disponible lorsque getCurrentSession() est appelée

public SqLiteDataProvider() 
    { 
     lock (padlock) 
     { 
      ... 
      var session = sessionFactory.OpenSession(); 
      CurrentSessionContext.Bind(session); 

      var pathToMother = FileHelper.GetFilePathFromDirectoryName("src", @"mother.db3"); 
      var conn = (SQLiteConnection)sessionFactory.GetCurrentSession().Connection; 
      SQLiteDataLoader.ImportData(conn, pathToMother); 

      _activitySubjectDao = new ActivitySubjectDao(sessionFactory); 
     } 

= ============

après le travail de fond a terminé

le sam e ActivitySubjectDao est demandé de trouver des données et échoue lorsqu'il accède au champ:

protected ISession _session { get { return _sessionFactory.GetCurrentSession(); } } 

Lorsque le dao est construit sur l'arrière-plan enfilez la session est disponible.

==============

mise à jour

j'ai réussi à obtenir ce travail en séparant la tâche de construire l'usine de la session de celle de charger le test fichier de données, et tenant la référence d'usine dans la classe appelante (et découvert que je ne générais pas le schéma SQLite dans le processus, ce qui n'a pas aidé même un peu). Cela semble assez courant (créer une fabrique de sessions et extraire des données en arrière-plan) dans une application de bureau. J'espère donc que quelqu'un connaîtra une solution plus élégante.

Répondre

1

Je suppose que la session en cours est une variable [ThreadStatic] et n'est donc pas disponible pour le nouveau thread?