NHibernate fil de sécurité à la session

J'ai été en utilisant NHibernate pour un certain temps maintenant et ont trouvé de temps à autre, que si j'essaie de demander à deux pages simultanément (ou aussi près que je peux) il sera parfois d'erreur. Donc, je suppose que c'était parce que ma gestion de Session n'était pas thread-safe.

Je pensais que c'était ma classe, j'ai donc essayé d'utiliser une méthode différente de ce blog http://pwigle.wordpress.com/2008/11/21/nhibernate-session-handling-in-aspnet-the-easy-way/ cependant, je reçois toujours les mêmes questions. L'erreur que j'obtiens est:

Server Error in '/AvvioCMS' Application.
failed to lazily initialize a collection, no session or session was closed
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: NHibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed

Ça ou pas datareader est ouvert, mais c'est le principal coupable.

J'ai placé ma session de la gestion de classe ci-dessous, quelqu'un peut tache pourquoi je suis peut-être avoir ces problèmes?

public interface IUnitOfWorkDataStore
{
object this[string key] { get; set; }
}
public static Configuration Init(IUnitOfWorkDataStore storage, Assembly[] assemblies)
{
if (storage == null)
throw new Exception("storage mechanism was null but must be provided");
Configuration cfg = ConfigureNHibernate(string.Empty);
foreach (Assembly assembly in assemblies)
{
cfg.AddMappingsFromAssembly(assembly);
}
SessionFactory = cfg.BuildSessionFactory();
ContextDataStore = storage;
return cfg;
}
public static ISessionFactory SessionFactory { get; set; }
public static ISession StoredSession
{
get
{
return (ISession)ContextDataStore[NHibernateSession.CDS_NHibernateSession];
}
set
{
ContextDataStore[NHibernateSession.CDS_NHibernateSession] = value;
}
}
public const string CDS_NHibernateSession = "NHibernateSession";
public const string CDS_IDbConnection = "IDbConnection";
public static IUnitOfWorkDataStore ContextDataStore { get; set; }
private static object locker = new object();
public static ISession Current 
{
get 
{
ISession session = StoredSession;
if (session == null) 
{
lock (locker)
{
if (DBConnection != null)
session = SessionFactory.OpenSession(DBConnection);
else
session = SessionFactory.OpenSession();
StoredSession = session;
}
}
return session;
}
set
{
StoredSession = value;
}
}
public static IDbConnection DBConnection
{
get
{
return (IDbConnection)ContextDataStore[NHibernateSession.CDS_IDbConnection];
}
set
{
ContextDataStore[NHibernateSession.CDS_IDbConnection] = value;
}
}
}

Et le magasin réel que j'utilise est ceci:

public class HttpContextDataStore : IUnitOfWorkDataStore
{
public object this[string key]
{
get { return HttpContext.Current.Items[key]; }
set { HttpContext.Current.Items[key] = value; }
}
}

J'initialise la SessionFactory sur Application_Start avec:

NHibernateSession.Init(new HttpContextDataStore(), new Assembly[] { 
typeof(MappedClass).Assembly});

Mise à jour

Salut les gars, merci pour vos conseils, j'ai essayé différentes choses pour essayer de simplifier le code, mais je suis toujours en cours d'exécution dans les mêmes problèmes et j'ai peut-être une idée de la raison.

J'ai créer la session, conformément à la demande lorsque cela est nécessaire, mais dans mon global.asax je suis l'élimination de la session sur Application_EndRequest. Cependant, je suis la recherche de la Application_EndRequest est déclenché plus d'une fois alors que je suis en debug à la fin de chargement d'une page. Je pensais que l'événement est supposer de feu une fois à la fin de la requête, mais si elle n'est pas et certains autres éléments sont d'essayer d'utiliser la Session (qui est ce que l'erreur est de se plaindre) pour quelque étrange raison qui pourrait être mon problème et que la Session est toujours "thread-safe" c'est juste d'être éliminés au début.

Quelqu'un a des idées? J'ai fait un google et vu que le VS serveur de développement est la cause des problèmes comme ça, mais je suis en cours d'exécution à travers IIS.

OriginalL'auteur John_ | 2009-03-10