2011-01-05 7 views
3

HALLO,asp.net benutzerdefinierte Rolle Anbieter nhibernate Fehler

ich einen benutzerdefinierten Rollenanbieter in meiner nhibernate Anwendung bin der Umsetzung Ich habe ein Repository, das nenne ich, wenn ich die nhibernate Sitzung zugreifen möchten.

Also, wenn meine Rolle Provider initialisiert sich

public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) { 

      base.Initialize(name, config); 
      Repository = new Repository(); 
     } 

Dann überschreiben ich

public override string[] GetRolesForUser(string username) { 
     var users = Repository.QueryAll<Users>(); 

// ich dann filtern und so weiter

} 

Aber wenn diese Funktion ich rief Es wird immer ein Fehler angezeigt, dass die NHibernate-Sitzung geschlossen ist. gedebuggt ich die nhibernate Quellcode und es stellt sich heraus, dass die Sitzung hier eine andere guid hat, dass die Sitzung in meinem Controller (I auch ASP.NET MVC verwende). Und diese bestimmte Sitzung ist zu der Zeit geschlossen, die ich hier bin. Ich weiß nicht, wer es schließt. Ich weiß, dass es gestartet wird, wenn die Anwendung startet und nur dann.

Hat jemand eine Idee, was ich falsch mache? Ich möchte immer noch Nhibernate in diesem Anbieter verwenden, aber den Fehler nicht mehr erhalten. Danke

+0

was ist Ihre Session-Management-Strategie:

public Repository() { this.Session = SessionManager.GetCurrentSession(); } 

ich den Konstruktor ganz ich in diesem stattdessen setzen gelöscht? –

+0

beginne ich eine Sitzung Fabrik auf Application_Start und ich erhalte die cureent Sitzung im Repository Konstruktor – Para

+0

Ich meine, wann und wo tun Sie öffnen und schließen Sitzungen? –

Antwort

1

Dies ist, wie ich es evetually fixiert.

in meinem Repository-Klasse hatte ich dies:

private ISession _session; 
     protected ISession Session 
     { 
      get 
      { 
       if (_session == null) 
       { 
        _session = SessionManager.GetCurrentSession(); 
       } 
       return _session; 
      } 
     } 
2

ich hatte, was genau das gleiche Problem zu sein scheint. Vergessen Sie nicht, dass die Rollen- und Mitgliedschaftsanbieter nur einmal instanziiert werden und für die gesamte Lebensdauer der Anwendung bestehen. Wenn Sie ein Session-per-Web-Anfragemuster verwenden, wird die ISession nach der ersten Anfrage geschlossen, und dann wird jeder Verweis auf eine ISession intern des Anbieters für nachfolgende Anfragen wahrscheinlich null sein.

Sie können dies umgehen, indem Sie einen Verweis auf die ISessionFactory Injektion und GetCurrentSession Aufruf, anstatt direkt einen Verweis auf ein ISession halten.

Verwandte Themen